給定單鏈表頭節點,反轉鏈表並返回新頭節點。例如 1→2→3→4→5 → 5→4→3→2→1。
維護三個指針:
prev:已反轉部分的頭節點(初始 nullptr)。curr:當前待處理節點(初始 head)。next:暫存 curr->next 防止丟失。while (curr) {
next = curr->next; // 1. 保存下一節點
curr->next = prev; // 2. 反轉指針
prev = curr; // 3. prev 前進
curr = next; // 4. curr 前進
}
return prev; // 最後 prev 是新頭節點
ListNode* reverseList(ListNode* head) {
ListNode* prev = nullptr;
ListNode* curr = head;
while (curr) {
ListNode* next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
return prev;
}
curr->next 前必須先存 next,否則後續鏈表丟失。curr==nullptr,prev 指向原尾節點(新頭)。head==nullptr 直接返回 nullptr,代碼天然兼容。ListNode* reverseList(ListNode* head) {
if (!head || !head->next) return head;
ListNode* newHead = reverseList(head->next);
head->next->next = head;
head->next = nullptr;
return newHead;
}
遞歸版本佔用 O(n) 棧空間,但邏輯極其簡潔:反轉子表後,將當前節點接到子表尾部。
LeetCode 206 是鏈表反轉的標準模板。三指針迭代法是面試首選(O(1) 空間、無棧溢出風險)。掌握「保存 next → 反轉指針 → 移動指針」三步曲,可解決「反轉部分鏈表、K 個一組反轉」等進階問題。