給定鏈表,每兩個相鄰節點交換位置。例如 1→2→3→4 → 2→1→4→3。需原地修改指針,不修改節點值。
使用哨兵節點 dummy,prev 指向待交換對的前一節點。每次交換 prev->next 和 prev->next->next。
// 交換前: prev → a → b → nextPair ListNode* a = prev->next; ListNode* b = a->next; ListNode* nextPair = b->next; // 1. prev → b prev->next = b; // 2. b → a b->next = a; // 3. a → nextPair a->next = nextPair; // 更新 prev 為 a (下一對的前一節點) prev = a;
ListNode* swapPairs(ListNode* head) {
ListNode dummy(0);
dummy.next = head;
ListNode* prev = &dummy;
while (prev->next && prev->next->next) {
ListNode* a = prev->next;
ListNode* b = a->next;
ListNode* nextPair = b->next;
prev->next = b;
b->next = a;
a->next = nextPair;
prev = a;
}
return dummy.next;
}
prev→b,再 b→a,最後 a→nextPair。prev->next && prev->next->next 確保至少有兩個節點可交換。ListNode* swapPairs(ListNode* head) {
if (!head || !head->next) return head;
ListNode* nextPair = head->next->next;
ListNode* newHead = head->next;
newHead->next = head;
head->next = swapPairs(nextPair);
return newHead;
}
LeetCode 24 是鏈表指針操作基本功訓練。掌握「三節點交換指針重組」模板,可解決「K 個一組翻轉、隔節點交換」等變體。畫圖推導指針順序是避免錯誤的關鍵。