LeetCode 两两交换链表中的节点:Java 递归与迭代解法
一、原题回顾
题目描述: 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。 你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4] 输出:[2,1,4,3]
示例 2:
输入:head = [] 输出:[]
示例 3:
输入:head = [1] 输出:[1]
提示:
- 链表中节点的数目在范围
[0, 100]内 0 <= Node.val <= 100
二、原题分析
这道题要求我们成对地交换相邻节点,且不能通过交换 val 值来实现,必须通过调整指针完成真正的节点交换。
核心难点:
- 指针操作复杂:每交换一对节点,需要同时更新多个
next指针; - 边界条件多:
- 空链表(
head == null) - 单节点链表(无法交换)
- 奇数长度链表(最后一个节点保持不动)
- 空链表(
- 头节点可能变化:原
head在交换后不再是头节点,需正确返回新头。
关键观察:
- 每次操作涉及三个节点:前驱(用于连接)、当前对(node1, node2);
- 交换后,原
node1成为该对的尾节点,应指向下一组交换后的头节点; - 若使用哑节点(Dummy Node),可统一处理头节点变更问题。
三、答案构思
思路 1:递归(自顶向下)
将问题分解为:
- 交换前两个节点;
- 递归处理剩余链表;
- 将第一对与后续结果连接。
✅ 优点:代码简洁,逻辑清晰 ❌ 缺点:空间复杂度 O(n),可能栈溢出(尽管 n≤100 安全)
思路 2:迭代(自底向上)
使用循环,每次处理一对节点:
- 维护一个
temp指针,始终指向当前待处理对的前驱; - 交换
temp.next和temp.next.next; - 移动
temp到下一对的前驱(即原node1)。
✅ 优点:O(1) 空间,效率高,工业级推荐 ❌ 缺点:指针操作稍显繁琐,需仔细画图

