首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

單鏈表原地反轉圖解:三指針法逐節點反向掛接

     編輯:程式設計綜合問答

頭插法建立的單鏈表,如何在 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;            // 新頭節點
}

題目中 (1)(2) 兩句解析

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;
}

掌握迭代法,面試手寫不再卡殼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved