如何有效地从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
    相关的成本。但是,如果元素重新插入到集合中,则插入顺序不受影响,因此请在重新插入之前尝试删除元素的第一次插入
你说得对,API在这一点上很糟糕。LinkedList的内部工作不是公开的,甚至在时间上也不是固定不变的。LinkedList中的节点类的名称已随时间更改。我想你唯一的选择就是创建自己的类。您可以复制粘贴LinkedList源代码,并根据需要对其进行修改。问题是,在重新插入元素时,您应该如何从列表中找到该元素?每个图形节点都包含对其列表节点的引用。当我通过graph节点时,我使用此引用从列表中删除节点,然后将graph节点插入列表的末尾(并将引用保存到新的列表节点,即插入列表末尾的节点)。@Sage如果您将您的评论写下来作为答案,我将能够感谢您帮助我…@Nayish,对不起,事实上,我认为你是对的,我应该把这篇文章作为对未来可能搜索的人的回答。谢谢:)