【发布时间】:2021-01-06 03:55:29
【问题描述】:
如何从 LinkedList 获取对实际节点(条目)对象的引用 - 不是它所拥有的值?
像这样:
import java.util.LinkedList;
public class Main {
public static void main(String[] args) {
LinkedList<String> test = new LinkedList<String>();
test.addLast("first");
test.addLast("second");
test.addLast("third");
var thirdNodeReference = test.getLastNode(); // Does this even exist ?
test.addLast("fourth");
var secondNodeReference = thirdNodeReference.previous(); // To perform such operations.
}
}
java LinkedList 中是否存在类似LinkedList.getLastNode() 的方法,以便对其执行previous() 或next() 操作?
我知道LinkedList.listIterator() 存在,但这没有用,因为我将引用每个节点(条目),我需要使用它们 - 例如上面代码中的lastNodeReference。
如果 JAVA 标准库中不存在这样的功能,我可以使用任何第三方(外部)库吗?
原因:
我需要访问节点以在O(1) 中执行remove() 操作。
在实际的JAVA code implementation 中,它在O(N) 中执行此操作,方法是遍历列表以通过在其路径上的每个节点上执行equals() 来查找包含给定对象的节点。另外,请检查此comment。
如果我们有对 Node 对象的直接引用,这可以在 O(1) 中理想地执行 - 因为 remove() 只需要更改 previous 和 next Node 的 2 个指针。
【问题讨论】:
-
您将以何种方式“与他们合作”?也就是说,你想做什么
ListIterator不允许你做? -
您无法直接访问
Node条目,它不是LinkedList的公共api 的一部分,它是内部的东西。见这里:hg.openjdk.java.net/jdk/jdk11/file/1ddf9a99e4ad/src/java.base/…,它被实现为private static class Node<E> -
@KevinAnderson 所以我需要维护 2
LinkedLists<String>(原始,更新)。假设我有一个对original列表的中间节点之一的引用:someNode。所以,现在我需要更新它的字符串值 -> 从original列表中弹出它 -> 将它插入到最后更新的列表中。我突然想到,当我将它从原始列表中弹出时,我必须更新前一个节点的next值以指向下一个节点的下一个someNode。 -
@MarcoLucidi 任何具有此类功能的第三方库?
-
这与仅仅从
original删除节点有何不同?您已经可以在ListIterator或列表本身上使用remove()方法。
标签: java linked-list java-11 doubly-linked-list standard-library