[路飞]_两两交换链表中的节点

154 阅读1分钟

题目介绍

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

示例1

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

示例2

输入: head = []
输出: []

示例 3:

输入: head = [1]
输出: [1]

 

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/sw… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

设置虚拟节点dummyHead, 让dummyHead的next指向head,让temp等于dummyHead,然后循环temp节点, 做以下操作

  1. 记录pre 节点等temp的next节点
  2. 记录当前节点cur 等 temp的next的next节点
  3. 设置当前pre节点的next 等 cur的next节点
  4. 设置cur的next 等 pre
  5. 设置temp的next 等 cur
  6. 设置temp 等 pre
var swapPairs = function (head) {
  if (!head) return null
  let dummyHead = new ListNode(-1, head)
  let temp = dummyHead
  // -1 => 1 => 2 => 3 => 4 => 5 => null
  while (temp.next && temp.next.next) {
    let pre = temp.next // 1 -----   3
    let cur = temp.next.next // 2 ----- 4
    pre.next = cur.next // 1 => 3 ----- 3 => 5
    cur.next = pre // 2 => 1 ----- 4 => 3
    temp.next = cur // -1 => 2 ----- 1 => 4
    temp = pre // 1 ----- 3
  }
  return dummyHead.next
}