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

标签 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),否定了使用 a 的全部意义链表开始。

当然,我可以自己实现 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 相关的成本。 .但是,如果将元素重新插入到集合中,插入顺序不会受到影响,因此请尝试在重新插入元素之前删除第一个插入的元素

关于java - 如何有效地从java LinkedList中删除一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20772961/

相关文章:

java - 防止加速器在输入子项时触发

.net - 定期迭代不断变化的集合

collections - 在 solr cloud 4.4 设置中重命名集合

java - 逐行读取时如何打印上一行和下一行以比较字符串

java - 如何在参数化测试中对测试数据进行分组?

java - Autowired 在自定义约束 validator 中给出 Null 值

javascript - ReactJS 可检查列表问题

javascript - jQuery/JavaScript : My recursive setTimeout function speeds up when tab becomes inactive

visual-studio - Windows gcc 编译和 Visual Studio 编译之间的性能比较

对于相同的对象,Java 哈希码在一种情况下会发生冲突,而在另一种情况下不会发生冲突,为什么? (下面的代码)