给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 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(1)
func swapPairs(head *ListNode) *ListNode {
dummyHead := &ListNode{}
// 哨兵节点
dummyHead.Next = head
cur := dummyHead
for cur.Next != nil && cur.Next.Next != nil {
node1 := cur.Next // 暂存节点1
node3 := cur.Next.Next.Next // 暂存节点3
cur.Next = cur.Next.Next // 哨兵节点指向 节点2,此时链表状态:dummyHead -> 2 -> 3 -> 4
cur.Next.Next = node1 // 节点2 指向 节点1,此时链表状态:dummyHead -> 2 -> 1 -> 2 ...(此处反复指向了) || 3 -> 4
node1.Next = node3 // 节点1 指向 节点3,此时链表状态:dummyHead -> 2 -> 1 -> 3 -> 4
cur = cur.Next.Next // 将 cur 指针指向到要移动节点的前一位,要置换 3 和 4 了,这里将 cur 指向 第二个节点(值为1)
}
return dummyHead.Next
}
递归法:
func swapPairs(head *ListNode) *ListNode {
if head == nil || head.Next == nil {
return head
}
next := head.Next
head.Next = swapPairs(next.Next)
next.Next = head
return next
}
评论前必须登录!
注册