链表两两交换是链表操作中的经典问题,掌握它有助于深入理解指针操作和递归思维。
1. 场景与类比
该操作类似于生活中的顺序调整,如排队交换位置或整理书架相邻书籍。在实际业务中常见于以下场景:
- 数据排序:局部重排用户列表显示顺序。
- 任务调度:调整任务队列执行顺序以提升效率。
- 游戏设计:动态调整排行榜玩家位置。
2. 解法分析
解法 1:递归(Recursion)
思路:每次处理当前节点和下一个节点,交换位置后递归处理剩余链表。终止条件为当前节点为空或下一个节点为空。
- 时间复杂度:O(n)
- 空间复杂度:O(n),受递归调用栈影响
解法 2:迭代(带哑节点)
思路:引入哑节点作为辅助,方便处理头节点交换。每次处理一对节点,调整指针完成交换,然后移动到下一对。
- 时间复杂度:O(n)
- 空间复杂度:O(1)
解法 3:迭代(无哑节点)
思路:直接操作头节点,需额外处理头节点交换情况,逻辑稍复杂。
- 时间复杂度:O(n)
- 空间复杂度:O(1)
最优解法建议
推荐迭代解法(带哑节点),因其空间复杂度低、逻辑清晰且避免了递归调用栈开销,工程实践中通常性能更优。
3. 代码实现(Java)
public ListNode swapPairs(ListNode head) {
if (head == null || head.next == null) return head;
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode prev = dummy;
while (prev.next != null && prev.next.next != null) {
ListNode first = prev.next;
ListNode second prev.next.next;
prev.next = second;
first.next = second.next;
second.next = first;
prev = first;
}
dummy.next;
}


