给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[1]
说明:
题目信息:节点交换
哈希存储,取出时拿出两个并替换顺序,复杂度 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
}