emp*_*art 12 complexity-theory linked-list time-complexity singly-linked-list doubly-linked-list
为什么双链表(O(1))中节点删除的时间复杂度比单链表(O(n))中的节点删除更快?
小智 33
该问题假定要删除的节点是已知的,并且指向该节点的指针可用.
为了删除节点并将前一个节点和下一个节点连接在一起,您需要知道它们的指针.在双向链表中,两个指针都在要删除的节点中可用.在这种情况下,时间复杂度是恒定的,即O(1).
而在单链接列表中,指向前一节点的指针是未知的,并且只能通过从头部遍历列表直到它到达具有指向要删除的节点的下一节点指针的节点来找到.在这种情况下,时间复杂度为O(n).
在仅通过值知道要删除的节点的情况下,必须搜索列表,并且在单链接和双链接列表中时间复杂度变为O(n).
实际上,单链表中的删除也可以在O(1)中实现.
给出具有以下状态的单链表:
SinglyLinkedList:
Node 1 -> Node 2
Node 2 -> Node 3
Node 3 -> Node 4
Node 4 -> None
Head = Node 1
Run Code Online (Sandbox Code Playgroud)
我们可以这样实现delete Node 2:
Node 2 Value <- Node 3 Value
Node 2 -> Node 4
Run Code Online (Sandbox Code Playgroud)
在这里,我们将其值替换为Node 2下一个node(Node 3)的值,并将其下一个值指针设置为Node 3(Node 4)的下一个值指针,跳过现在有效的"重复" Node 3.因此不需要遍历.
在已知位置插入和删除的时间复杂度为 O(1)。然而,找到该位置的时间复杂度为 O(n),除非它是列表的头或尾。
当我们谈论插入和删除复杂性时,我们通常假设我们已经知道这将发生在哪里。