使用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中,数据似乎没有被修改。那么我如何才能真正找出“下一个”(或双链表中的“前一个”)元素是谁?
答案 0 :(得分:14)
你做不到。 LinkedList只是List的一个实现,不再提供。你需要自己制作。
对于node1.next()
,您需要从node1
到列表的引用。实际上,您需要多个引用,因为node1
可能会有多次。此外,它可能包含在多个列表中。
也许您可以使用ListIterator
。
答案 1 :(得分:6)
我不知道你正在使用什么Node
类,但是LinkedList<T>
有自己的内部节点类,你无法访问它。调用add
会将值添加到列表中 - 您无法显式插入保存值的节点,或以任何其他方式访问节点本身。是的,有时可能会很痛苦。
如果您需要一个带有节点公共封装的链表,您需要找到不同的实现或自己动手。
答案 2 :(得分:2)
最佳解决方案: 在构造新的列表项对象时创建自己的下一个和最后一个链接:
在全局范围内使用最后一个插入的对象
public MyLinkedListItem(){
if(lastInserted != null){
lastInserted.next = this;
this.last = lastInserted;
}
lastInserted = this;
}
答案 3 :(得分:1)
LinkedList类名的“链接”部分仅指其实现。该接口不会公开显式方法来执行您想要的操作。
LinkedList实现Collection(和List)接口,因此给定列表i
中元素的索引list
,您可以使用list.get(i-1)
和{{获取上一个和下一个元素1}},分别。对于LinkedList,这些方法的实现非常慢。如果你做了很多上一个/下一个操作,请考虑实现你的列表或改为使用ArrayList。
答案 4 :(得分:1)
我不同意接受的答案。只要你有头元素就可以。一旦通过删除并且不返回下一个元素或在第一个元素之前插入元素而不返回它而丢失对第一个元素的引用,您将无法进行搜索。
答案 5 :(得分:1)
您可以使用迭代器遍历节点,例如:
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());