24.两两交换链表中的节点

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

示例 1:

img

1
2
输入:head = [1,2,3,4]
输出:[2,1,4,3]

示例 2:

1
2
输入:head = []
输出:[]

示例 3:

1
2
输入:head = [1]
输出:[1]

Solution:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Solution {
public ListNode swapPairs(ListNode head) {
// 创建一个虚拟头节点,并让其next指针指向链表的真实头节点head
ListNode dummyHead = new ListNode(0);
dummyHead.next = head;

// 初始化temp指针,开始时指向虚拟头节点
ListNode temp = dummyHead;

// 当temp后面有至少两个节点时,进行交换
while (temp.next != null && temp.next.next != null) {
// node1是要交换的第一个节点
ListNode node1 = temp.next;
// node2是要交换的第二个节点
ListNode node2 = temp.next.next;

// 交换node1和node2
temp.next = node2; // 将temp的next指向node2,使node2成为这对节点的第一个节点
node1.next = node2.next; // 将node1的next指向node2的下一个节点,即交换后的node1的下一个节点
node2.next = node1; // 将node2的next指向node1,完成交换

// 将temp移动到这对节点的第二个节点上,即现在的node1,为下一对节点的交换做准备
temp = node1;
}

// 返回虚拟头节点的next,即新的链表头节点
return dummyHead.next;
}
}