我有一个算法,我以某种方式在图中传递节点,偶尔会多次通过同一个节点,我需要形成一个传递的节点列表,这样一个节点最后出现一次我通过它的时间。
例如,如果我通过节点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?有什么东西我不见了吗?
答案 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性能。