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 :
通过次数 1.2M 提交次数 1.6M 通过率 74.6%
```
输入: preorder = [3,9,20,15,7], inorder = [
```
输入:inorder = [9,3,15,20,7], postorder
```
输入: head = [-10,-3,0,5,9]
输出: [0,-3,9
```
输入:root