如何有效地从java LinkedList中删除元素
我有一个算法,在这个算法中,我以某种方式通过一个图中的节点,偶尔会多次通过同一个节点,我需要形成一个通过的节点列表,这样一个节点在我最后一次通过它时出现一次 例如,如果我通过节点如何有效地从java LinkedList中删除元素,java,performance,collections,linked-list,Java,Performance,Collections,Linked List,我有一个算法,在这个算法中,我以某种方式通过一个图中的节点,偶尔会多次通过同一个节点,我需要形成一个通过的节点列表,这样一个节点在我最后一次通过它时出现一次 例如,如果我通过节点A->B->C->A->C,那么我最后需要的列表是[B,A,C] 我想做的是使用LinkedList,这样图中的每个节点都将包含对LinkedList中其节点的引用。然后,每次我通过一个节点时,我都会从LinkedList中删除其对应的节点,然后再次将其插入LinkedList的末尾,操作的复杂性只会是O(1) 然而,当
A->B->C->A->C
,那么我最后需要的列表是[B,A,C]
我想做的是使用LinkedList,这样图中的每个节点都将包含对LinkedList中其节点的引用。然后,每次我通过一个节点时,我都会从LinkedList中删除其对应的节点,然后再次将其插入LinkedList的末尾,操作的复杂性只会是O(1)
然而,当我开始实现它时,我遇到了一个问题:显然,java类LinkedList不允许我查看它的实际列表节点。使用LinkedList的常规remove函数删除包含给定图形节点的列表节点将是O(n)
,而不是O(1)
,从而否定了使用LinkedList开始的全部意义
当然,我可以自己实现LinkedList,但我宁愿避免这种情况——在我看来,如果我必须用java实现LinkedList,我就做错了
那么,有没有一种不用我自己实现LinkedList就能解决这个问题的方法?有什么我遗漏的吗?LinkedHashMap保留输入值的顺序,并允许按其键删除节点,然后放回末尾。我认为这就是您所需要的。除非您的链接列表很大,否则即使使用洗牌,使用常规数组列表也能提供快速性能。如果顺序不重要的话,还应该考虑使用哈希集,如果插入事项的顺序,链接哈希集,或者如果需要排序,则设置树集。它们不允许重复值,但在插入、删除和包含方面具有良好的O性能。看起来,您期望的是一种内置方法,我认为没有任何集合提供这种功能。您必须按照@MartijinCourteaux的建议自行实现它。或:
- 对于操作:
,使用排序集集合,如支持成本添加、删除和包含
李>O(log n)
- 但是要注意,与
不同,HashSet
可以具有LinkedHashSet
操作的预期性能:O(1)
,但是性能可能略低于add、contains、remove
,因为维护链接列表的额外费用。但是我们可以使用它,而不会增加与HashSet
相关的成本。但是,如果元素重新插入到集合中,则插入顺序不受影响,因此请在重新插入之前尝试删除元素的第一次插入李>TreeSet