#两两交换链表中的节点

🔗 LeetCode

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

示例 1:

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

示例 2:

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

示例 3:

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

说明

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

#解题思路

题目信息:节点交换

#思路一

哈希存储,取出时拿出两个并替换顺序,复杂度 O(n),O(n)

#思路二

三指针遍历,复杂度 O(n),O(1)

#首次代码

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     val: number
 *     next: ListNode | null
 *     constructor(val?: number, next?: ListNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.next = (next===undefined ? null : next)
 *     }
 * }
 */

function swapPairs(head: ListNode | null): ListNode | null {
  const hash: ListNode[] = []
  let i = head

  let virtualHead = new ListNode()
  let j = virtualHead

  while (i) {
    hash.push(i)
    i = i.next
  }

  if (hash.length < 2) return head

  while (hash.length > 1) {
    const l = hash.shift()
    const r = hash.shift()
    l.next = null
    r.next = null

    j.next = r
    r.next = l
    j = l
  }

  if (hash.length) {
    j.next = hash.shift()
  }

  return virtualHead.next
}

#二次代码

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     val: number
 *     next: ListNode | null
 *     constructor(val?: number, next?: ListNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.next = (next===undefined ? null : next)
 *     }
 * }
 */

function swapPairs(head: ListNode | null): ListNode | null {
  if (!head) return head

  let virtualHead = new ListNode()
  virtualHead.next = head

  let pre = virtualHead
  let l = head
  let r = head.next

  while (r) {
    l.next = r.next
    r.next = l
    pre.next = r

    if (l.next && l.next.next) {
      pre = l
      r = l.next.next
      l = l.next
    } else {
      break
    }
  }

  return virtualHead.next
}