簡體   English   中英

如何從java LinkedList中有效地刪除元素

[英]How to efficiently remove an element from java LinkedList

我有一個算法,我以某種方式通過圖中的節點,偶爾多次通過同一個節點,我需要形成一個傳遞的節點列表,這樣一個節點出現一次,我最后一次通過它。

例如,如果我通過節點A -> B -> C -> A -> C ,我最終需要的列表是[B, A, C]

我想要做的是使用LinkedList,這樣圖中的每個節點都將包含對LinkedList中其節點的引用。 然后,每次我通過一個節點,我將從LinkedList中刪除它的相應節點,並將其再次插入到LinkedList的末尾,並且操作的復雜性將只是O(1)

但是,當我開始實現這個時,我遇到了一個問題:顯然,java類LinkedList不允許我看到它的實際列表節點。 使用LinkedList的常規刪除函數來刪除包含給定圖節點的列表節點將是O(n)而不是O(1) ,否定使用LinkedList開始的全部要點。

當然,我可以自己實現LinkedList,但我寧願避免這種情況 - 在我看來,如果我必須在java中實現LinkedList,我做錯了。

那么,有沒有辦法解決這個問題而不自己實現LinkedList? 有什么東西我不見了嗎?

看起來,你期待一種內置的方法,我認為沒有任何Collection提供這樣的功能。 你必須自己實現它,如@MartijinCourteaux所建議的那樣。 要么:

  • 使用像TreeSet<E>這樣的Sorted Set集合,支持操作的O(log n)成本: add, remove and contains
  • LinkedHashSet<E>但要注意,與HashSet<E>LinkedHashSet可以具有O(1)預期的操作性能: add, contains, remove但是性能可能略低於HashSet ,因為增加了維護費用鏈表。 但我們可以使用它而不會產生與TreeSet相關的增加的成本。 但是, 如果將元素重新插入到集合中 ,則插入順序不會受到影響,因此請在重新插入之前嘗試刪除元素的第一次插入

LinkedHashMap保持輸入值的順序,並允許通過其鍵刪除節點,然后放回到最后。 我認為這就是你所需要的。

除非您的鏈表很大,否則只需使用常規數組列表即可實現快速性能。 您還應該考慮使用哈希集,如果順序不重要,如果插入順序很重要則鏈接哈希集,或者如果要對其進行排序則設置樹集。 它們不允許重復值,但對插入,刪除和包含具有良好的O性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM