24. 两两交换链表中的节点
题目描述:
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[1]
提示:
- 链表中节点的数目在范围 [0, 100] 内
- 0 <= Node.val <= 100
解题分析及思路:
交换链表的本质就是交换节点之间的Next
节点。
只需要处理好交换的顺序即可。
例如 1 -> 2 -> 3 -> 4 -> 5
,经过交换后变成 2 -> 1 -> 4 -> 3 -> 5
。
其中,以 3 (cur) -> 4
为例,设置pre
为 3 (cur)
的前序节点:
- 需切断
4 -> 5
之间的联系,方便后续找到5,需设置临时变量:temp := cur.Next.Next
- 将
pre
的Next指向4(cur.Next):pre.Next = cur.Next
- 将 4 的Next指向3(cur):
pre.Next.Next = cur
- 将 3 的Next指向5(temp):
cur.Next = temp
- 重新为
pre
和cur
赋值即可。
因为根节点无前序节点pre,所以需要构建一个虚拟的pre节点root。
func swapPairs(head *ListNode) *ListNode {
root := &ListNode{}
root.Next = head
pre := root
cur := root.Next
for cur != nil && cur.Next != nil {
temp := cur.Next.Next
pre.Next = cur.Next
pre.Next.Next = cur
cur.Next = temp
pre = cur
cur = temp
}
return root.Next
}
复杂度:
- 时间复杂度:O(N),其中 N 是链表的节点数量。
- 空间复杂度:O(1),只使用常数额外空间。
执行结果:
- 执行耗时:1 ms,击败了10.86% 的Go用户
- 内存消耗:2 MB,击败了76.34% 的Go用户
Tags :
通过次数 1M 提交次数 1.4M 通过率 73.5%