前言
上一个攻略我们解决了k个一组链表的翻转问题,今天这个两两交换链表中的节点,你可以直接令k=2即可,当然我们这里会用一种更简单的方法来实现,无需额外定义翻转函数;
题目描述
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例 1:
输入: head = [1,2,3,4]
输出: [2,1,4,3]
结合下图开始解题
var swapPairs = function(head) {
if(!head) return null;
let ret = new ListNode(-1,head), pre = ret, cur = head;
while(cur && cur.next) { // 我们交换的节点cur和cur.next必须都为真才可交换
let temp = cur.next; // 1、图中第1步:保存cur.next的临时指针
cur.next = cur.next.next; // 2、图中第2步:将待交换的首节点指向尾节点的下一个节点,为交换的第一步
temp.next = cur; // 3、图中第3步:将待交换的尾节点指向首节点,为交换的第二步
pre.next = temp; // 4、图中第4步:将待交换节点的前一个节点即pre指向的节点连接待交换的尾部节点
pre = cur; // 最后我们移动pre指针到交换后的尾节点(即交换前的首节点)
cur = cur.next; // cur对应我们交换前的首节点,他的下一个节点就是我们下次交换的起始节点;
}
return ret.next;
};