当前位置: 首页 > 面试题库 >

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

廖令
2023-03-14
问题内容

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

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

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

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

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


问题答案:

首先: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)。



 类似资料:
  • 问题内容: 我正在做一个作业,告诉我假设我有一个带有标题和尾部节点的单链接列表。它要我在位置p之前插入项目y。有人可以查看我的代码并告诉我我是否走对了吗?如果没有,您能为我提供任何提示或指示(无双关语)吗? 我认为我可能是错的,因为即使在问题描述中特别提到了头和尾节点,我也根本不使用头和尾节点。我正在考虑编写一个while循环来遍历列表,直到找到p并以这种方式解决问题,但这不是固定时间的,对吗?

  • 据说 LinkedList 删除和添加操作的复杂性为 在 的情况下,它是 大小为“M”的数组列表的计算:如果我想删除第N个位置的元素,那么我可以使用index一次直接转到第N个位置(我不必遍历到第N个索引),然后我可以删除元素,直到此时复杂度为O(1),然后我必须移动其余的元素(M-N次移动),所以我的复杂度将是线性的,即O(M-N-1)。因此在最后删除或插入会给我最好的性能(如N ~ M ),而

  • 好吧,关于LinkedList和ArrayList有很多讨论,但当我在《用Java思考》中看到这个描述时,我仍然感到困惑: LIKEDList还实现了基本的列表接口,如ARARYLIST DO,但是它比ARARYList更有效地执行某些操作(列表中的插入和删除)。 我不知道为什么它强调“在列表的中间”,我想在列表的开头插入时,ArrayList也需要转移后面的元素,而且它比LinkedList快吗

  • 我正在尝试执行GET命令,以便我可以从服务器获取数据。下面的Curl适用于Postman。 在运行我的代码时,我能够获取会话ID。下一步是获取数据。但是当我执行GET时,我没有得到任何响应。相反,我得到一个错误,如下所示:“指定的值具有无效的HTTP标头字符。(参数'name')” 下面是我试图执行的C代码 问题:我没有收到来自服务器的响应,响应长度为零。 以下是答案:0 回答ErrorMessa

  • 我正在读取删除单链接列表的最后一个元素的算法。假设我有一个名为ListNode的链接列表对象: 我发现删除列表最后一个节点的方法是: 我很困惑这个代码是如何工作的,因为一切都是通过“节点”。然而,当返回头时,最后一个节点被删除。因此,我想知道它是如何工作的,是否与Java中的“价值传递”有关?

  • 问题内容: 数据库:ORACLE 我们为休眠使用了改良的NamingStrategy,在hbm文件中,我们明确给出了表名。 但是,仍然在删除和插入操作期间,它会针对某些表生成作为前缀的“ T_”和作为前缀的“ HT_”。 这导致SQLGrammarException: org.hibernate.exception.SQLGrammarException:无法执行语句 请注意,这是在使用Oracl