LeetCode 两两交换链表中的节点
题目描述
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。不能修改节点的值,只能修改节点的指针。
示例:
输入:head = [1,2,3,4] 输出:[2,1,4,3]
知识点讲解
- 链表的基本操作 链表(Linked List)是一种线性数据结构,是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。由于链表中的指针指向下一个节点,所以链表中的数据元素在内存中并不是顺序存储的。相比于数组的顺序存储,链表的优点在于链表插入和删除操作的时间复杂度为O(1),因为在链表中执行插入和删除只需要修改指针,不需要移动结点。
常见的链表操作有:链表的创建、链表的遍历、链表的插入和删除、链表的反转和翻转等等。
以下为实现单向链表的代码:
class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
class LinkedList {
ListNode head;
public LinkedList() {
this.head = null;
}
public void add(int val) {
if (head == null) {
head = new ListNode(val);
return;
}
ListNode cur = head;
while (cur.next != null) {
cur = cur.next;
}
cur.next = new ListNode(val);
return;
}
public void print() {
ListNode cur = head;
while (cur != null) {
System.out.print(cur.val + " ");
cur = cur.next;
}
System.out.println();
}
}
- 链表的遍历 遍历单向链表可以使用while循环,每次将当前节点向后移动一位,直到节点为null为止。对于给定的单向链表,我们可以通过以下代码进行遍历:
ListNode cur = head;
while (cur != null) {
// 处理节点cur
cur = cur.next;
}
- 链表的交换 交换链表节点时,我们需要记录上一个节点、当前节点和下一个节点。首先我们使用辅助节点pre记录上一个节点,需要交换的节点为cur和nex,交换前cur节点的next指针指向nex的下一个节点,即cur.next = nex.next,然后将pre节点的next指针指向nex,nex的next指针指向cur节点,即pre.next = nex,nex.next = cur。最后,我们将pre指向cur,继续进行下一组节点的交换即可。如下图所示:
由于需要交换两个节点,因此我们需要在遍历时从第二个节点开始交换。我们可以设置一个空的节点作为头结点,使其指向链表的头节点,然后在遍历单向链表时每次取出两个节点进行交换即可。如下代码实现:
public ListNode swapPairs(ListNode head) {
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode pre = dummy;
while (pre.next != null && pre.next.next != null) {
ListNode cur = pre.next;
ListNode nex = cur.next;
cur.next = nex.next;
nex.next = cur;
pre.next = nex;
pre = cur;
}
return dummy.next;
}
完整的Java代码如下:
class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
class Solution {
public ListNode swapPairs(ListNode head) {
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode pre = dummy;
while (pre.next != null && pre.next.next != null) {
ListNode cur = pre.next;
ListNode nex = cur.next;
cur.next = nex.next;
nex.next = cur;
pre.next = nex;
pre = cur;
}
return dummy.next;
}
}
总结
本文介绍了LeetCode中的两两交换链表中的节点问题,并对链表的基本知识点进行了讲解,包括链表的创建、链表的遍历和链表的交换。最后,通过Java实现了该题的解法,希望对大家有所帮助。