题目描述
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:

输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[1]
思路&js代码
1、迭代
- 哨兵节点简化逻辑
- node0、node1、node2、node3
var swapPairs = function(head) {
const dummy = new ListNode(0, head); // 用哨兵节点简化代码逻辑
let node0 = dummy;
let node1 = head;
while (node1 && node1.next) { // 至少有两个节点
const node2 = node1.next;
const node3 = node2.next;
node0.next = node2; // 0 -> 2
node2.next = node1; // 2 -> 1
node1.next = node3; // 1 -> 3
node0 = node1; // 下一轮交换,0 是 1
node1 = node3; // 下一轮交换,1 是 3
}
return dummy.next; // 返回新链表的头节点
};2、递归
更好理解点
var swapPairs = function(head) {
if (head === null || head.next === null) {
return head;
}
const node1 = head;
const node2 = head.next;
const node3 = node2.next;
node1.next = swapPairs(node3); // 1 指向递归返回的链表头
node2.next = node1; // 2 指向 1
return node2; // 返回交换后的链表头节点
};