首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

LeetCode Delete Node in a Linked List - 只給節點刪除該節點

     編輯:關於C++

題目大意

給定單鏈表中非尾節點的引用,要求在 O(1) 時間內刪除該節點。無法訪問頭節點,也無法訪問前驅節點。

經典技巧:值複製 + 跳過下一個

因為無法修改前驅的 next,但可以修改當前節點的值與 next。將下一個節點的值複製到當前節點,然後將當前節點的 next 指向下下個節點。邏輯上相當於「刪除了下一個節點,並把當前節點偽裝成下一個」。

public class Solution {
    public void deleteNode(ListNode node) {
        node.val = node.next.val;
        node.next = node.next.next;
    }
}

為什麼有效?

  • 題目保證給定節點不是尾節點,所以 node.next 一定存在。
  • 外部觀察者遍歷鏈表時,會看到原本屬於下一個節點的值出現在當前位置,且原下一個節點被跳過 —— 達到「刪除當前節點」的效果。
  • 實際上被釋放的是下一個節點的內存(若語言需手動管理),但邏輯上滿足題意。

注意事項

  • 若語言有 GC(Java、Python、Go 等),被跳過的節點會自動回收。
  • C/C++ 中若需釋放內存,可先保存 node.next 指針,修改完後 delete 該指針。
  • 此技巧不適用於尾節點(無下一個節點可複製),也不適用於需保持節點對象身份的場景(如其他指針引用該節點)。

複雜度

  • 時間:O(1)
  • 空間:O(1)

總結

這是一道腦筋急轉彎題,核心在於「無法修改前驅,卻能修改自身與後繼」。面試中直接寫出兩行代碼並解釋原理即可,展示對鏈表指針操作的靈活理解。

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