Java 提供了 List 接口的 LinkedList 实现,它实际上是一个双向链表。如果我们执行以下操作:
linkedlist.remove(obj);
接着:
linkedlist.add(obj);
我们实际上从链表中删除对象 obj 并从右端(尾部)重新插入它。
我们还可以手动实现带有节点、头和尾的链表。在诸如 C++ 等具有一些低级特性的语言中,可以使用指针指向 obj 对象的下一个和上一个对象。因此,我们实际上不必删除该项目,而只需更新前一个和下一个指针。
Java中是否有任何数据结构可以产生相同的效果(因此仅删除对象本身的“指针”可以获得相同的性能增益)?
请注意,我想使用现成的数据结构,而不是手动编写我的一个链表实现(并且可能重新发明轮子)。此外,请注意它不一定是链表 - 例如,它可能是某种队列,例如 ArrayDeque。
编辑:换一种说法,如果 Java 中 List 接口的 LinkedList 实现在内部使用了 prev 和 next 指针,那么为什么 l.remove(obj) 是 O(n) 而不是 O(1)?因此在实践中,当您有一个包含数百万个对象的 LinkedList(如我的情况)时,执行此删除和重新插入需要很长时间?(与 ArrayList 相同,与 ArrayDeque 相同 - 很长时间)。