问题描述
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
注意:不能修改节点内部的值,只能实际交换节点。
核心思路
处理链表交换时,头结点往往比较特殊。引入哑节点(dummy node)可以统一逻辑,避免单独处理头结点被交换的情况。
我们需要维护四个指针来追踪当前待交换的一对节点以及它们的前后关系:
node0:当前待交换对的前驱节点(初始指向哑节点)node1:当前对的第一个节点node2:当前对的第二个节点node3:下一对的起始节点(即node2的后继)
交换的核心在于重连指针:
node0.next指向node2node2.next指向node1node1.next指向node3
完成后,将 node0 移到 node1,node1 移到 node3,继续处理下一对。循环终止条件是 node1 或 node1.next 为空,确保每次都是成对交换。
代码实现
class Solution {
public ListNode swapPairs(ListNode head) {
ListNode dummy = new ListNode(0, head);
ListNode node0 = dummy;
ListNode node1 = head;
while (node1 != null && node1.next != null) {
ListNode node2 = node1.next;
ListNode node3 = node2.next;
// 断开并重连,完成一对交换
node0.next = node2;
node2.next = node1;
node1.next = node3;
node0 = node1;
node1 = node3;
}
dummy.next;
}
}


