【问题标题】:Java delete node from linked list by referenceJava通过引用从链表中删除节点
【发布时间】:2014-03-28 20:32:46
【问题描述】:

如何通过引用对象或特定节点有效地从 java 的 LinkedList 中删除节点?使用 remove(object) 遍历整个列表,如文档所示:“删除第一个元素 e 使得 (o==null ? e==null : o.equals(e))”。我可以通过对节点的特定引用来删除吗?我不介意将对节点的引用存储在对象本身中。我不能使用列表的索引,因为它可能会改变。如果没有,是否有其他数据结构可以让我这样做?

【问题讨论】:

  • 基本上你想要一个指向你的节点的指针?
  • 你自己的链表?内置LinkedList?如果是您自己的,则取决于您如何实现它。你试过什么?您可以发布相关代码并描述您遇到的问题吗?至于其他数据结构,这取决于您的要求。你必须更具体。

标签: java data-structures linked-list


【解决方案1】:

尝试使用LinkedHashSet。它基本上是一个HashSet,其元素具有确定性排序。或者,您可以将其视为由元素查找表支持的 LinkedList

我相信remove(Object) 操作将是固定时间的。

【讨论】:

  • 谢谢,这非常接近我想要的。但是,当我想通过引用直接访问时,散列似乎仍然是一种解决方法。
  • HashSet 不允许重复。您可能需要牢记这一点来定义您的 equals 和 hashCode 方法。如果交互性能至关重要,您还需要注意初始容量
【解决方案2】:

您可能想使用HashSet

删除、插入一般都是常数时间,如官方API所述:

此类为基本操作提供恒定时间性能 (添加、删除、包含和大小),假设散列函数分散 桶中的元素正确

如果您决定使用 HashSet,请不要忘记在您的对象中同时覆盖 equalshashcode 方法。

【讨论】:

  • 我确实考虑过 HashSet,但我需要保留插入顺序。另外,当我想通过引用直接访问时,散列似乎是一种解决方法。
  • 在这种情况下,正如@tskuzzy 回答的那样,您需要LinkedHashSet。但散列不是“一种解决方法”
猜你喜欢
  • 1970-01-01
  • 2012-12-28
  • 1970-01-01
  • 2010-12-23
  • 2019-01-01
  • 1970-01-01
  • 2012-11-06
  • 2013-01-08
相关资源
最近更新 更多