給定單鏈表,將相鄰節點成對交換,返回新頭節點。要求 O(1) 額外空間,不可修改節點值,只能調整指針。
例如:1→2→3→4 → 2→1→4→3。
基本情況:head == nullptr 或 head->next == nullptr,直接返回 head。
遞歸步驟:
newHead = head->next(第二個節點將成為新頭)nextPair = newHead->next(第三個節點,下一組的頭)newHead->next = head(完成本組交換)head->next = swapPairs(nextPair)(遞歸處理剩餘)newHead// Java 版
public ListNode swapPairs(ListNode head) {
if (head == null) return null;
if (head.next == null) return head;
ListNode newHead = head.next;
ListNode nextPair = head.next.next;
newHead.next = head;
head.next = swapPairs(nextPair);
return newHead;
}
使用虛擬頭節點 dummy 簡化邊界處理,維護 prev 指向已處理部分的尾節點。
// C++ 版
ListNode* swapPairs(ListNode* head) {
ListNode dummy(0);
dummy.next = head;
ListNode* prev = &dummy;
while (prev->next && prev->next->next) {
ListNode* first = prev->next;
ListNode* second = first->next;
ListNode* nextPair = second->next;
prev->next = second;
second->next = first;
first->next = nextPair;
prev = first; // first 現為本組尾部
}
return dummy.next;
}
| 方面 | 遞歸 | 迭代 |
|---|---|---|
| 空間複雜度 | O(n) 棧空間 | O(1) |
| 代碼簡潔度 | 極高 | 中等 |
| 長鏈表安全性 | 可能棧溢出 | 安全 |
| 指針操作直觀度 | 隱式 | 顯式、易調試 |
nextPair 導致鏈表斷裂。prev 更新錯誤(應移至原 first,即現尾節點)。head==nullptr 或單節點情況。Swap Nodes in Pairs 是鏈表指針操作基礎題。遞歸寫法適合面試快速表達思路;迭代寫法是工程級首選。掌握「虛擬頭節點 + 三指針(prev, first, second)+ 保存下一組頭」模式,可輕鬆擴展到 K 組翻轉等變體。