【问题标题】:Lower level access to Java LinkedList?对 Java LinkedList 的较低级别访问?
【发布时间】:2011-03-24 23:33:04
【问题描述】:

我有一个包含一些特殊元素的元素列表,我需要在恒定时间内找到这些元素的邻居。使用双向链表这听起来很容易:只需存储对包含这些特定元素的节点的引用并检查它们的上一个和下一个节点。 (我也更喜欢使用链表,因为我经常删除和添加元素。链表很大,性能尤为重要。)

但是,Java 的 LinkedList 似乎不允许我存储包含元素的节点。是对的吗?如果是这样,是否有一种干净的方式来做我需要做的事情?这应该不难,但我没有找到解决方案。

这需要与不断变化的列表一起工作,并且我不希望在更改期间不必更新任何内容(例如,如果我使用数组,则每当它们在数组中移动时,我都必须不断更新它们的索引)。此外,我将来可能需要从那个特殊节点开始遍历列表而不浪费时间找到那个节点(这在链表的低级实现中也很容易),所以我会更加感谢一个解决方案也解决了这个问题。

编辑:感谢您的回答。不过,我希望有一个不涉及实现我自己的链表版本的解决方案。有吗?

【问题讨论】:

  • 我可能错了,但扩展 AbstractSequentialList 似乎是您对我的最佳选择。
  • 一个 ArrayList 会做你想做的事。
  • @Romain Hippeau 修改数组列表是相当昂贵的。
  • 实现我自己的双向链表是一种解决方案,但对我来说工作越少越好。 :) 感谢您的回复。
  • “不过,我希望有一个不涉及实现我自己的链表版本的解决方案。有吗?” - 尝试为某人找到解决方案已经实施。但是要求>>我们

标签: java data-structures linked-list


【解决方案1】:

我认为实现您自己的双向链表类是为您的应用程序获得最佳性能的唯一方法。

标准列表实现通过使用抽象/信息隐藏来维护列表不变量。因此,它们“正常工作”......如果涉及多个线程,则以应用程序在同步方面做正确的事情为模。

您希望(并且可能需要)深入了解抽象并了解实现细节,然后执行可能导致违反不变量的事情。不支持。

【讨论】:

    【解决方案2】:

    您可以将ListIterator 与它的 next() 和 previous() 方法一起使用。注意:如果您在不使用 ListIterator 的情况下以任何方式更改列表,则 ListIterator 将失效。

    或者您可以使用 ArrayList 的索引。

    【讨论】:

    • 我认为 OP 哀叹的是您无法访问(和存储)实际的列表条目容器,因此给定值对象,您可以在恒定时间内从那里开始跳来跳去。但他们没有被曝光是有充分理由的。
    • 您可以创建自己的双向链表。但是,您最终可能会引用不再在列表中的节点。 ;)
    • 这正是我提到的很好的理由。 :) 虽然在自定义实现中,您可以在条目容器中保留一个布尔字段,告诉您您的引用是否仍然有效。
    猜你喜欢
    • 1970-01-01
    • 2017-04-24
    • 2011-07-23
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    相关资源
    最近更新 更多