Java Util链表-如何找到下一个?

Java Util链表-如何找到下一个?,java,Java,在使用Java时,如何找出元素的下一个或上一个关系 我的意思是,在一个常规的链表中,我会这样做: 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());

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

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

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());
其中,节点是我自己的数据/对象容器


但在Java的LinkedList中,数据似乎没有被修改。那么,我如何才能真正找出“下一个”(或者在双链表的情况下是“上一个”)元素是谁呢?

你不能。LinkedList只是List的一个实现,只提供了其他功能。你需要做你自己的

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


也许您可以使用
ListIterator

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

如果您还需要一个带有节点公共封装的链表,那么您需要找到一个不同的实现或滚动自己的实现。

LinkedList类名的“链接”部分仅指其实现。接口不公开显式方法来执行您想要的操作


LinkedList实现了集合(和列表)接口,因此给定列表中元素的索引
i
,您可以分别使用
List.get(i-1)
List.get(i+1)
获取上一个和下一个元素。对于LinkedList,这些方法的实现相当缓慢。如果你做了很多PREV/NEXT操作,考虑执行你的列表或者使用一个ARARYList来代替。

< P>我不同意接受的答案。只要你有head元素,你就可以。一旦删除并没有返回下一个元素而丢失了对第一个元素的引用,或者在第一个元素之前插入一个元素但没有返回它,您将无法执行搜索

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

只需在更全局的地方插入一个lastInserted对象

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

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

    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());
Node node1=新节点();
Node node2=新节点();
LinkedList=新建LinkedList();
列表。添加(节点1);
列表。添加(节点2);
迭代器m_Iterator=list.Iterator();
//将迭代器设置为第一个节点
m_迭代器.next();
//然后我的节点1就会知道下一个是谁:
assertEquals(node2,m_iterator.next());

如果我去list.add(node1),会发生什么;列表。添加(节点1)?对于了解“链表”的人来说,Java的LinkedList有点用词不当。在Java中,它并不是唯一有误导性的,或者至少是命名不好的东西(“并发修改异常”也出现在脑海中)。但当然,你可以期待来自Java-kool'aid的饮酒者的评论,他们相信Java神创造的一切都是完美的,可以向你解释为什么LinkedList是一个真正的comp-sci链接列表,为什么我是傻瓜等等;)Java中有很多糟糕的东西,但LinkedList和CME都很好。除非你想把它命名为ListImplementedaDoubleLinkedList,同时你或其他人修改了你的收藏,否则我不知道如何命名。也就是说,我同意一个更好的名字会更好,我只是找不到。是的,“链接”列表就到此为止。这是相当悲哀的,因为我希望“链接列表”的实现。哦,好吧,我要开始我自己的。@drozzy-或者,再看看你在做什么,看看如果你不考虑
next
prev
指针,你是否能更好地实现它。我希望,但我正在实现一个范围树,它需要一个叶子的双链接列表。@drozzy不是Guava的
RangeMap
吗?对不起,节点是我自己想象的数据容器。在这种情况下,我会说java的LinkedList不适合我,这对我来说毫无意义。让第一个元素为
“f”
,查找元素
“e”
之后的下一个元素。