小编典典

在Java中,为什么在链表中插入或删除是恒定时间操作?这不是误导吗?

java

假设我们已经有一个指向该节点的指针,则在列表的特定点插入或删除元素是恒定时间操作。-来自链接列表上的Wikipedia文章

单个链表中的链表遍历始终从头开始。我们必须继续努力直到满足给定条件。

因此,除非我们处理头节点,否则这将使任何操作都变得最糟O(n)。

我们不能直接链接列表中的给定指针。那么为什么说这是一个恒定时间的操作呢?

编辑:即使我们有一个指向该节点的指针,我们也必须从头开始才对吗?那么恒定时间运行如何


阅读 214

收藏
2020-11-16

共1个答案

小编典典

首先:LinkedListSun
JDK中实现的有效地具有到最后一个元素以及到第一个元素的链接(只有一个head条目,但head.previous指向最后一个元素)。这意味着即使在最坏的情况下,通过列表导航到索引所指示的元素也应执行n
/ 2次操作。这也是一个双向链表。

除此之外:LinkedList因为不需要遍历所有元素,所以简单地将O(1)插入a的开头或结尾。

在其他任何地方插入/删除都取决于您执行的方式!如果使用Iterator(的a
ListIterator表示加法),则该操作也可以是O(1),因为该操作Iterator已经具有对相关条目的引用。

但是,如果您正在使用add(int, E)remove(int)LinkedList则将必须
找到 相关条目(O(n)), 然后 删除元素(O(1)),因此整个操作将为O(n)。

2020-11-16