链表两两交换
这道题是链表操作的一个经典问题,掌握了它,你对链表的指针操作和递归思维会有更深的理解。
1. 题目背景与业务场景
生活中很多事情都像是'交换顺序'或者'重新排列'。例如在整理一排书时,把相邻的两本书交换位置,就像链表的两两交换,需要调整指针让相邻节点的位置互换。
业务场景:
- 数据排序:对数据进行局部重排,如用户列表中两两交换显示顺序。
- 任务调度:在任务队列中调整执行顺序,如优先级相邻任务交换。
- 游戏设计:动态调整玩家位置,用于视觉效果或平衡机制。
2. 解法分析
解法 1:递归(Recursion)
思路:用递归处理链表。每次处理当前节点和下一个节点,交换它们的位置,然后递归处理剩余链表。终止条件是当前节点为空或下一个节点为空。
- 时间复杂度:O(n)
- 空间复杂度:O(n)(递归栈)
public ListNode swapPairs(ListNode head) {
if (head == null || head.next == null) return head;
ListNode first = head;
ListNode second = head.next;
first.next = swapPairs(second.next);
second.next = first;
return second;
}
解法 2:迭代(带哑节点 Dummy Node)
思路:引入一个哑节点作为辅助,方便处理头节点交换。每次处理一对节点,调整指针完成交换,然后移动到下一对节点。
- 时间复杂度:O(n)
- 空间复杂度:O(1)
推荐实现:
public ListNode swapPairs(ListNode head) {
if (head == null || head.next == null) return head;
ListNode dummy = new ListNode();
dummy.next = head;
dummy;
(prev.next != && prev.next.next != ) {
prev.next;
prev.next.next;
prev.next = second;
first.next = second.next;
second.next = first;
prev = first;
}
dummy.next;
}


