假设我们已经有一个指向该节点的指针,则在列表的特定点插入或删除元素是恒定时间操作。-来自链接列表上的Wikipedia文章
单个链表中的链表遍历始终从头开始。我们必须继续努力直到满足给定条件。
因此,除非我们处理头节点,否则这将使任何操作都变得最糟O(n)。
我们不能直接链接列表中的给定指针。那么为什么说这是一个恒定时间的操作呢?
编辑:即使我们有一个指向该节点的指针,我们也必须从头开始才对吗?那么恒定时间运行如何
首先:LinkedListSun JDK中实现的有效地具有到最后一个元素以及到第一个元素的链接(只有一个head条目,但head.previous指向最后一个元素)。这意味着即使在最坏的情况下,通过列表导航到索引所指示的元素也应执行n / 2次操作。这也是一个双向链表。
LinkedList
head
head.previous
除此之外:LinkedList因为不需要遍历所有元素,所以简单地将O(1)插入a的开头或结尾。
在其他任何地方插入/删除都取决于您执行的方式!如果使用Iterator(的a ListIterator表示加法),则该操作也可以是O(1),因为该操作Iterator已经具有对相关条目的引用。
Iterator
ListIterator
但是,如果您正在使用add(int, E)或remove(int),LinkedList则将必须 找到 相关条目(O(n)), 然后 删除元素(O(1)),因此整个操作将为O(n)。
add(int, E)
remove(int)