頭插法建立的單鏈表,如何在 O(1) 額外空間下反轉?核心是三指針迭代:pre、cur、next,逐個將 cur->next 指向 pre。
void reverse(ListNode** head) {
ListNode *pre = NULL;
ListNode *cur = *head;
ListNode *next = NULL;
while (cur) {
next = cur->next; // 1. 暫存後繼
cur->next = pre; // 2. 反向指向前驅
pre = cur; // 3. pre 後移
cur = next; // 4. cur 後移
}
*head = pre; // 新頭節點
}
r = p->next; // 暫存 p 的下一個
p->next = L->next; // (1) p->next 指向 當前反轉後的頭部 (L->next)
L->next = p; // (2) L->next 更新為 p,完成「頭插」到反轉鏈表頭部
p = r; // p 後移繼續處理
這其實是頭插法構建反轉鏈表:以 L 為哨兵頭,不斷將原鏈表節點摘下,頭插到 L 後面,最終 L->next 指向反轉後的新頭。
原始: L -> 1 -> 2 -> 3 -> NULL 步驟1: L -> 1 -> NULL, p=2 步驟2: L -> 2 -> 1 -> NULL, p=3 步驟3: L -> 3 -> 2 -> 1 -> NULL, p=NULL 完成
ListNode* reverseRec(ListNode* head) {
if (!head || !head->next) return head;
ListNode* newHead = reverseRec(head->next);
head->next->next = head;
head->next = NULL;
return newHead;
}
掌握迭代法,面試手寫不再卡殼。