题目:两两交换链表中的节点
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例:
给定 1->2->3->4, 你应该返回 2->1->4->3.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/swap-nodes-in-pairs/
解题思路
这条题可以使用链表操作中最常用的一个概念:dummyHead(虚拟头节点),如何使用如下图:
定义好一个虚拟节点后把它的next
指向head,然后开始对链表进行循环操作,循环步骤如下:
- 先用一个
p
指向最开始的节点,然后判断p.next
和p.next.next
是否存在,同时存在才能进行两个节点交换 - 把
p.next
和p.next.next
缓存为n1
和n2
,同时把n2
的next
也取出来 - 接下来是核心步骤,先把
n2.next
指向n1
,n1.next
指向next
两个节点交换完后好像可以进行下一次循环进行下一轮交换了?当然不是,不要忘记刚才的p
节点,当n1
和n2
交换完后p
和n2
都同时指向n1
,因此要进行更正把p
指向n2
,同时把p
更新为n1
,这样才可以对下一轮交换的节点进行判断 - 重复上述步骤,当循环结束后返回
dummyHead.next
就是交换后的结果
代码实现
const swapPairs = function (head) {
let dummyHead = new ListNode(null);
dummyHead.next = head;
let p = dummyHead;
while (p.next && p.next.next) {
let node1 = p.next,
node2 = p.next.next,
next = node2.next;
node2.next = node1;
node1.next = next;
p.next = node2;
p = node1
}
let list = dummyHead.next;
dummyHead = null;
return list
};