24. 两两交换链表中的节点
题目
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
题解
核心就是上面的图,1和2交换,3和4交换,也就是用虚拟头节点的next指向2,2的next指向1,1的next指向3,则完成一次交换
在这里插入代码片class Solution {
public ListNode swapPairs(ListNode head) {
//虚拟头节点
ListNode dummyNode = new ListNode(0);
//设置头节点的next指针,串在一起
dummyNode.next = head;
//定义一个prev节点用于下面代码的遍历操作
ListNode prev = dummyNode;
//终止条件,prev到达倒数第二个节点,head就是最后一个
while (prev.next != null && prev.next.next != null) {
//缓存3号节点,因为2号节点的next会断开3号,指向1号
ListNode temp = head.next.next;
//头节点指向2号节点,也就是将2号节点放第一位
prev.next = head.next;
//2号节点指向1号节点,也就是互换
head.next.next = head;
//将1号节点指向缓存的3号节点 ,一次反转结束
head.next = temp;
//指针向前移.继续反转
prev = head;
head = head.next;
}
return dummyNode.next;
}
}