繁体   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