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

示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]

示例 2:
输入:head = []
输出:[]

示例 3:
输入:head = [1]
输出:[1]

提示:

  • 链表中节点的数目在范围 [0, 100] 内
  • 0 <= Node.val <= 100

解题思路

这题和之前的合并两个有序链表有大量的相似点,让当前的head节点成为我们自己创建的节点的next,此时进行交换即:

  1. temp.next = node2 把node2移动到最前面,直接成为temp的next节点
  2. node1.next = node2.next 把原先node2的next转交给node1
  3. node2.next = node1 把node2的next设置为node1,这样就完成了node1和node2的交换
  4. 将temp指向node1,进行下一轮的交换

代码实现

var swapPairs = function(head) {
if (!head?.next) { //如果节点为空或者仅有一个节点直接原样返回
return head
}

let result = new ListNode(0, null)
result.next = head //创建一个空节点,让它的next为传入的head
let temp = result //创建一个指针,现在指向最开始的创建的空节点

while (temp?.next && temp?.next?.next) { //如果当前指针后面有两个节点,那么就可以进行交换
const node1 = temp.next //获取指针后的两个节点
const node2 = temp.next.next

temp.next = node2 //将node2成为指针的next,即相当于将node2移动到前面
node1.next = node2.next //将node2的后面节点转交给node1
node2.next = node1 //将node1放到node2之后,那么就完成了 node1和node2的交换

temp = node1 //完成交换之后,将指针指向node1,这样下一轮循环的时候,就会交换node1后面的两个节点
}

return result.next //返回结果
};