📘题目描述
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4] 输出:[2,1,4,3]
示例 2:
输入:head = [] 输出:[]
示例 3:
输入:head = [1] 输出:[1]
💡解题思路:链表指针操作(迭代)
使用一个 dummy节点 简化操作。
每次处理一对节点:
-
记录第一和第二个节点
-
调整指针完成交换
-
移动到下一对节点继续处理
🚩步骤总结
-
新建一个虚拟头节点
dummy
,指向链表的头部。 -
用指针
pre
指向每次要交换的两个节点的前一个节点。 -
交换
first
和second
两个节点。 -
更新
pre
和head
指向下一对节点。
✅Python 代码
class Solution:
def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
dummy = ListNode(0) # 创建一个虚拟头节点,便于处理头节点变化
dummy.next = head
pre = dummy
while head and head.next:
first = head # 当前要交换的第一个节点
second = head.next # 当前要交换的第二个节点
# 开始交换
pre.next = second
first.next = second.next
second.next = first
# 移动指针,准备交换下一对
pre = first
head = first.next
return dummy.next
⏱️复杂度分析
项目 | 复杂度 | 说明 |
---|---|---|
时间复杂度 | O(n) | 遍历链表一次,每个节点访问一次 |
空间复杂度 | O(1) | 只使用了有限数量的额外指针 |
其中 n
是链表的节点数。
🧱常见易错点总结
错误点 | 说明 |
---|---|
忽略链表节点数是奇数 | 最后一个节点不用交换 |
指针调整顺序出错 | 交换指针时一定按顺序修改 |
忘记移动 pre 和 head 指针 | 每次交换后要更新到下一组 |
🎯总结
-
使用 dummy节点 是链表修改中常见的技巧,特别适合处理头节点变化的问题。
-
注意节点指针调整的顺序,保持链表正确连接。