在Java中,为什么在链表中插入或删除是一个固定时间操作?Isn';这难道不具有误导性吗?

在Java中,为什么在链表中插入或删除是一个固定时间操作?Isn';这难道不具有误导性吗?,java,linked-list,Java,Linked List,假设已经有指向节点的指针,则在列表的特定点插入或删除元素是一个常量时间操作。 -从 单个链表中的链表遍历始终从头部开始。我们必须继续前进,直到满足一个给定的条件 所以这将使任何操作在最坏的情况下成为O(n),除非我们处理的是头部节点 我们不能直接指向链表中的给定指针。那么,为什么说这是一个恒定时间的操作呢 编辑: 即使我们有一个指向节点的指针,我们也必须从头部开始,对吗?那么,恒定时间操作是如何进行的呢?您自己说过:“假设我们已经有了指向节点的指针”。这避免了您确定为线性时间原因的遍历 诚然,维

假设已经有指向节点的指针,则在列表的特定点插入或删除元素是一个常量时间操作。 -从

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

所以这将使任何操作在最坏的情况下成为O(n),除非我们处理的是头部节点

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

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

您自己说过:“假设我们已经有了指向节点的指针”。这避免了您确定为线性时间原因的遍历

诚然,维基百科的文本有点模棱两可,因为涉及到两个节点:一个是正在插入的节点,另一个是在插入节点的列表中。

“假设我们已经有了指向该节点的指针,这是一个固定时间操作”


你似乎错过了第一个假设。

你错过了我认为这里的要点。只有插入和删除具有恒定的时间,而不是找到插入或删除点!
时间是恒定的,因为您只需要设置对列表中上一个和下一个项目的引用(链接)——而对于ArrayList,在插入的情况下,您需要为(至少)多个项目分配内存,并将现有数据传输到新分配的数组中(或者删除时,删除项目后必须在数组中移动元素)。

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

除此之外:插入
LinkedList的开头或结尾非常简单,因为不需要遍历所有元素

在其他地方插入/删除取决于具体操作方式!如果使用(of a)进行添加,则操作也可以是O(1),因为
迭代器将已经有了对相关条目的引用


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

“即使我们有一个指向节点的指针,我们也必须只从头部开始,对吗?”.错。我们有一个指向节点的指针。我们不是从头部开始的。这就是“指向节点的指针”意思是说。@redmave:LinkedList实现了一个单链表的假设是错误的:它是一个双链表。@redmave:so?在Java中,LinkedList实现了一个双链表。所以不是所有适用于“计算机科学”中定义的“链表”的东西必然适用于Java中的
LinkedList
。我引自:“所有操作的执行都与双链接列表的预期一样。”@redmave:你是对的,对于一个单链表,我们需要一个指向插入点之前的节点的指针。我根据这个修改了维基百科文章中的句子。当遍历一个列表时,我们通常可以安排它。它是单链表,你不能将上一个项目的引用设置为下一个项目。所以我同意删除我的观点SO(n),虽然插入当然是O(1)。事实上,如果您没有删除头的引用,它将是Θ(n)。而且数组列表通常是O(1)分期插入,但不太确定是否删除,可能是O(n).@mathepic-这可以通过在遍历列表时在要删除的节点之前保留一个指向该节点的指针来解决。@Stephen C我们不能保证只保证有一个指向要删除的节点的指针。例如,如果所有节点都被某个映射指向(无论出于何种原因)我们可能没有指向节点的指针。@mathepic-如果我们不能保证这一点,那么问题在于我们如何实现链接遍历的细节。Wikipedia文章的原始措辞可能会留下一些不尽如人意的地方……但这只是措辞的问题。(我假设)作者试图使其有效。谢谢!把尾巴和头连接起来的聪明方法。