這道題目要求將單鏈表中的節點兩兩交換。例如給定 1->2->3->4,交換後變為 2->1->4->3。核心難點在於指針操作的正確性,稍有不慎就會導致鏈表斷裂或丟失節點。
我們需要同時處理三個任務:交換當前兩個節點、連接前一段已處理的鏈表、保存後續待處理的鏈表。這需要四個關鍵指針配合:
cur->next,用於連接下一輪交換
pprev 連接上一輪結果class Solution {
public:
ListNode* swapPairs(ListNode* head) {
if (!head || !head->next) return head;
ListNode* newHead = head->next; // 新頭節點
ListNode* prev = head;
ListNode* cur = head->next;
ListNode* next = cur->next;
// 第一組交換
cur->next = prev;
prev->next = nullptr;
ListNode* pprev = prev; // 指向已處理部分的尾部
while (next) {
prev = next;
cur = prev->next;
if (!cur) { // 奇數長度,最後一個節點無法配對
pprev->next = prev;
break;
}
next = cur->next;
cur->next = prev;
prev->next = nullptr;
pprev->next = cur; // 連接上一輪結果
pprev = prev; // 更新尾部指針
}
return newHead;
}
};

pprev 維護已處理鏈表的尾部,避免斷鏈next 指針,否則會丟失後續節點