两两交换链表中的节点
要求
给一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
思路
假设该链表为:1->2->3->4->5
定一个虚拟头节点let ret = new ListNode(-1, head)
再let一个temp指向虚拟头节点(用来寻找交换的节点)let temp = ret
由上图可知,翻转的是head.next和head.next.next,所以我们可以来个while循环
// 判断,当temp后面还有两个节点的时候,满足翻转,才进入while循环
while (temp.next && temp.next.next) {
// let一个pre存temp.next,用来交换
let pre = temp.next;
// let一个pcur存temp.next.next,用来交换
let cur = temp.next.next;
// pre.next = cur.next详情见图1
pre.next = cur.next;
// cur.next = pre详情见图2
cur.next = pre;
// temp.next = cur详情见图3
temp.next = cur;
// temp = pre详情见图4
temp = pre;
}
图1:pre.next = cur.next;
图2:cur.next = pre;
图3:temp.next = cur;
图4:temp = pre;
完整代码
var swapPairs = function (head) {
if (!head) return head;
let ret = new ListNode(-1, head),
temp = ret;
while (temp.next && temp.next.next) {
let pre = temp.next;
let cur = temp.next.next;
pre.next = cur.next;
cur.next = pre;
temp.next = cur;
temp = pre;
}
return ret.next;
};