如何从java LinkedList中有效地删除元素

时间:2013-12-25 12:49:38

标签: java performance collections linked-list

我有一个算法,我以某种方式在图中传递节点,偶尔会多次通过同一个节点,我需要形成一个传递的节点列表,这样一个节点最后出现一次我通过它的时间。

例如,如果我通过节点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?有什么东西我不见了吗?

3 个答案:

答案 0 :(得分:1)

看起来,你期待一种内置的方法,我认为没有任何Collection提供这样的功能。你必须自己实现它,如@MartijinCourteaux所建议的那样。或者:

  • 使用排序集合集合,例如TreeSet<E>,支持费用为O(log n),用于操作:add, remove and contains
  • LinkedHashSet<E>但要注意与HashSet<E>不同,LinkedHashSet可以有O(1)预期的操作效果:add, contains, remove但性能可能略低于HashSet TreeSet的{​​{1}},由于维护链表的费用增加。但我们可以使用它,而不会产生与{{1}}相关的增加的成本。但是,如果将元素重新插入到集合中,插入顺序不会受到影响,因此请在重新插入元素之前尝试删除元素的第一次插入

答案 1 :(得分:0)

LinkedHashMap保持输入值的顺序,并允许通过其键删除节点,然后放回到最后。我认为这就是你所需要的一切。

答案 2 :(得分:0)

除非您的链表很大,否则只需使用常规数组列表即可实现快速性能。您还应该考虑使用哈希集,如果顺序不重要,如果插入顺序很重要则链接哈希集,或者如果要对其进行排序则设置树集。它们不允许重复值,但在插入,删除和包含时具有良好的O性能。