【问题标题】:Java Util Linked List - how to find next?Java Util Linked List - 如何找到下一个?
【发布时间】:2011-02-07 23:20:25
【问题描述】:

在使用 Java LinkedList 时如何找出元素的下一个或上一个关系?

我的意思是,在常规链表中,我会这样做:

Node node1 = new Node();
Node node2 = new Node();
LinkedList list = new LinkedList();
list.add(node1);
list.add(node2);

//then my node1 will know who it's next is:
assertEquals(node2, node1.next());

Node 是我自己的数据/对象容器。

但是在Java的LinkedList中,数据好像没有被修改过。那么我如何真正找出“下一个”(或在双向链表的情况下为“上一个”)元素是谁?

【问题讨论】:

  • 如果我去list.add(node1); list.add(node1);会发生什么?
  • 对于了解“链表”的人来说,Java 的 LinkedList 有点误导人。它不是 Java 中唯一具有误导性或至少命名不佳的东西(“并发修改异常”也浮现在脑海中)。但是当然你可以期待来自 Java-kool'aid 饮酒者的 cmets,他们相信 Java 之神创造的一切都是完美的,可以解释为什么 LinkedList 真的是一个 comp-sci 链表以及为什么我很愚蠢;)
  • Java中有很多不好的和可怕的东西,但是LinkedList和CME都很好。除非您想将其命名为 ListImplementedAsDoubleLinkedList 和 YouOrSomebodyElseHadModifiedYourCollectionInTheMeantime,否则我不知道如何命名。也就是说,我同意一个更好的名字会很好,我就是找不到。

标签: java


【解决方案1】:

你不能。 LinkedList 只是 List 的一个实现,仅提供而已。您需要自己制作。

对于node1.next(),您需要从node1 到列表的引用。实际上,您需要多个引用,因为 node1 可能多次出现。此外,它可能包含在多个列表中。

也许您可以为此使用ListIterator

【讨论】:

  • 这很可悲,因为我希望有一个“链表”实现。哦,好吧,我要自己动手了。
  • @drozzy - 或者,再看看你在做什么,看看如果你不按照nextprev 指针。
  • 我希望,但我正在实现一个范围树,这需要它的叶子的双向链表。
  • @drozzy Guava 的RangeMap 不可以吗?
【解决方案2】:

我不知道您使用的是什么 Node 类,但 LinkedList<T> 有自己的内部节点类,您无法访问。调用add 将向列表添加一个 - 您不能显式插入一个节点持有 一个值,或以任何其他方式访问节点本身。是的,有时这会很痛苦。

如果您还需要一个对节点进行公共封装的链表,则需要找到不同的实现或自行开发。

【讨论】:

  • 抱歉,Node 是我自己想象的数据容器。在这种情况下,我会说 java 的 LinkedList 不适合我。
【解决方案3】:

最佳解决方案: 在构建新的列表项对象时创建自己的下一个和最后一个链接:

在更全局的地方有一个 lastInserted 对象

public MyLinkedListItem(){
    if(lastInserted != null){
        lastInserted.next = this;
        this.last = lastInserted;
    }
    lastInserted = this;
}

【讨论】:

    【解决方案4】:

    您可以使用迭代器来移动节点,例如:

        Node node1 = new Node();
        Node node2 = new Node();
        LinkedList list = new LinkedList();
        list.add(node1);
        list.add(node2);
    
        Iterator <Node> m_iterator=list.iterator();
    
        //set iterator to first node
        m_iterator.next();
    
        //then my node1 will know who it's next is:
        assertEquals(node2, m_iterator.next());
    

    【讨论】:

      【解决方案5】:

      LinkedList 类名的“链接”部分仅指其实现。该接口不公开显式方法来做你想做的事。

      LinkedList 实现了集合(和列表)接口,因此给定列表list 中元素的索引i,您可以分别使用list.get(i-1)list.get(i+1) 获取上一个和下一个元素。对于 LinkedList,这些方法的实现非常缓慢。如果您做了很多 prev/next 操作,请考虑实现您的列表或使用 ArrayList 代替。

      【讨论】:

      • 是的,“链接”列表就这么多。
      【解决方案6】:

      我不得不不同意接受的答案。只要你有 head 元素,你就可以。一旦您通过删除而不返回下一个元素或在第一个元素之前插入一个元素而不返回它而失去对第一个元素的引用,您将无法进行搜索。

      【讨论】:

      • 这对我来说毫无意义。让第一个元素为"f",找出元素"e"之后的下一个元素。
      猜你喜欢
      • 2015-08-16
      • 2018-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-28
      • 2017-10-17
      • 1970-01-01
      • 2015-07-30
      相关资源
      最近更新 更多