[英]How to remove last element for a Singly Linked list in O(1)?
假設我有一個與哨兵的單鏈表。 要刪除O(1)時間中的最后一個元素,我需要維護最后2個元素的句柄。 但是保持最后兩個元素的句柄會使添加操作復雜化。
有沒有辦法刪除O(1)中帶有哨兵的單鏈接列表的最后一個元素,而又不維護最后2個元素的句柄? 我將非常感謝Java中的任何示例代碼。
謝謝。
使用以常規方式實現的單鏈接列表將執行O(N)
操作。
保留最后一個元素的句柄並不那么復雜,單鏈接列表實現通常會這樣做,以便可以在O(1)
的末尾添加。 但是,不可能在O(1)
“刪除最后一個”操作中維持到最后一個元素的鏈接。
想一想。 假設我在某處保留指向最后一個節點和第二個到最后一個節點的指針。 當我刪除最后一個節點時,我需要:
next
指針更新為null, last
指針以指向倒數第二個節點。 secondToLast
指針以指向它之前的節點。 但是,如何在不從頭開始遍歷列表的情況下執行最后一步...這是O(N)
操作?
現在,我想您可以對鏈表進行編碼,以使刪除的最后一個元素是第一次執行 O(1)
,而在以后的操作中刪除O(N)
...直到最后添加一個新元素。 但是除非您有一個不尋常的用例,否則這種“優化”是不值得的。
使用java.util.LinkedList
可能會更好,該java.util.LinkedList
使用雙向鏈表,並且具有removeOast removeLast()
方法,該方法為O(1)
。
不可以,從結尾刪除僅適用於雙向鏈表。 您需要返回指針,以將新的NULL終止符放在上一個鏈接上。 我建議將列表進行雙重鏈接以滿足您的要求。
您在制作自己的容器嗎? 為什么不使用雙向鏈接的java.util.LinkedList?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.