成对交换链表节点的题目要求将链表中每两个相邻节点交换位置。如果链表长度是奇数,最后一个节点保持不变。
算法思路:
-
通过遍历链表,每次交换两个相邻的节点。
-
需要考虑链表的头节点如何处理,可以使用虚拟头节点来简化边界条件的处理。
-
在每次交换时,确保指针的更新顺序正确:需要更新当前节点的前一个节点和后一个节点的指向。
步骤:
-
初始化一个虚拟头节点
dummy,它指向链表的头节点。 -
使用
prev指针遍历链表,跳过一对节点并交换它们。 -
对于每一对相邻的节点
(node1, node2),执行如下交换:-
prev.next = node2 -
node1.next = node2.next -
node2.next = node1
-
-
更新
prev到node1,继续下一对节点。
java
class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
public ListNode swapPairs(ListNode head) {
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode prev = dummy;
while (prev.next != null && prev.next.next != null) {
ListNode a = prev.next;
ListNode b = a.next;
// 核心三步交换
a.next = b.next;
b.next = a;
//要能连起来
prev.next = b;
// prev 向后移动两步
prev = a;
}
return dummy.next;
}
交换前:
prev -> a -> b -> next
交换后:
prev -> b -> a -> next
操作顺序不能错:
a.next = b.next
b.next = a
prev.next = b