为什么双向链表(O(1))中节点删除的时间复杂度比单向链表(O(n))中的节点删除快?双向链表中节点删除的时间复杂度
回答
它与修复正在删除的节点之前的节点中的下一个指针的复杂性有关。
因为你不能向后看...
问题假定节点被删除是已知的,一个指向该节点是可用的。
为了删除节点并将上一个节点和下一个节点连接在一起,您需要知道它们的指针。在双向链表中,两个指针在要删除的节点中可用。在这种情况下时间复杂度是恒定的,即O(1)。
而在单链表中,指向前一个节点的指针是未知的,只能通过从头开始遍历列表直到它到达具有指向要删除的节点的下一个节点指针的节点。这种情况下的时间复杂度是O(n)。
如果仅通过值知道要删除的节点,则必须搜索该列表,并且在单向链接和双向链接列表中时间复杂度变为O(n)。
这对于从单个链接列表中移除需要O(n)复杂性的节点而言是不正确的 - 请参阅下面的答案。有一个技巧,您可以从被删除的节点复制下一个节点的值,然后跳过该节点以指向节点,从而消除了遍历列表的任何需要。 – Ben 2017-10-07 07:17:42
在已知位置插入和删除是O(1)。然而,找到那个位置是O(n),除非它是列表的头部或尾部。
当我们谈论插入和删除复杂性时,我们通常假设我们已经知道将会发生什么。
除非要删除的元素是头(或第一个)节点,否则我们需要遍历要删除的节点之前的节点。因此,在最坏的情况下,即当我们需要删除最后一个节点时,指针必须一路走到第二个节点,从而遍历(n-1)个位置,这给我们的时间复杂度为O(n) 。
实际上单链表中的删除也可以在O(1)中实现。
给定一个单向链表具有以下状态:
SinglyLinkedList:
Node 1 -> Node 2
Node 2 -> Node 3
Node 3 -> None
Head = Node 3
我们可以以这样的方式实现delete Note 2
:
Node 2 Value <- Node 3 Value
Node 2 -> None
在这里,我们与它的未来价值取代Node 2
值节点(Node 3
),并将其下一个值指针设置为Node 3
(None
)的下一个值指针,跳过现在有效的“重复”Node 3
。因此不需要遍历。
- 1. 从双向链表中删除节点?
- 2. 双链表:删除节点
- 3. JVM空间复杂度的细节:单链表VS双向链表
- 4. 在从双向链表中删除节点时遇到问题
- 5. 双向搜索的时间复杂度
- 6. 时间复杂度 - 双向Dijkstra
- 7. 删除/撤销双向链表中的节点
- 8. 删除双向链表中的节点(C++)
- 9. 如何删除双向链表中的第一个节点?
- 10. 删除一个圆形双向链表中的节点
- 11. 单链表中的时间复杂度
- 12. 在O(n)的双向链表中插入/删除的时间复杂度是多少?
- 13. 如何从双向链表中删除节点
- 14. C:从双向链表中只删除一个节点
- 15. 如何从双向链表中删除节点?
- 16. 从双向链表中删除一个节点
- 17. 从单向链表中删除节点
- 18. 在双向链表中的给定节点之后删除节点
- 19. 在已排序的链接列表中插入节点的时间复杂度
- 20. 双向链表java删除
- 21. 计算BST节点移除的时间复杂度
- 22. 空间复杂度:链接列表节点数组(头)
- 23. 在恒定时间复杂度中查找双链表的中间元素
- 24. Python中双向随机访问的时间复杂度
- 25. 如何删除C中的双向链表中的备用节点?
- 26. 从java中的双链表中删除一个节点
- 27. 从双向链表中删除
- 28. 在双向链表中删除
- 29. 从双向链表中删除游标
- 30. java删除节点链表
作业?编写从单个链接列表中删除节点的代码,然后就会很明显。 – 2009-12-13 06:53:06
我认为在标题中不应该有像dll这样的缩写,但我想不出更好的缩写。 – 2009-12-13 07:08:40