为什么双链表(O(1))中节点删除的时间复杂度比单链表(O(n))中的节点删除更快?
答案 0 :(得分:29)
该问题假定要删除的节点是已知的,并且指向该节点的指针可用。
为了删除节点并将前一个节点和下一个节点连接在一起,您需要知道它们的指针。在双向链表中,两个指针都在要删除的节点中可用。在这种情况下,时间复杂度是恒定的,即O(1)。
在单链表中,指向前一节点的指针是未知的,只能通过从头部遍历列表直到它到达具有指向要删除的节点的下一个节点指针的节点。在这种情况下,时间复杂度为O(n)。
如果要删除的节点只能通过值知道,则必须搜索列表,并且在单链接和双链接列表中时间复杂度变为O(n)。
答案 1 :(得分:8)
实际上,单链表中的删除也可以在O(1)中实现。
给出一个具有以下状态的单链表:
SinglyLinkedList:
Node 1 -> Node 2
Node 2 -> Node 3
Node 3 -> Node 4
Node 4 -> None
Head = Node 1
我们可以通过以下方式实施delete Node 2
:
Node 2 Value <- Node 3 Value
Node 2 -> Node 4
这里我们将Node 2
的值替换为其下一个节点(Node 3
)的值,并将其下一个值指针设置为Node 3
的下一个值指针({{1}跳过现在有效的&#34;重复&#34; Node 4
。因此不需要遍历。
答案 2 :(得分:3)
因为你无法向后看...
答案 3 :(得分:2)
除非要删除的元素是头(或第一个)节点,否则我们需要在要删除的节点之前遍历该节点。因此,在最坏的情况下,即,当我们需要删除最后一个节点时,指针必须一直到第二个最后一个节点,从而遍历(n-1)个位置,这给了我们O(n)的时间复杂度
答案 4 :(得分:1)
它与修复你要删除的节点之前的节点中的下一个指针的复杂性有关。
答案 5 :(得分:1)
在已知位置的插入和删除是O(1)。但是,找到该位置是O(n),除非它是列表的头部或尾部。
当我们谈论插入和删除复杂性时,我们通常假设我们已经知道将要发生的位置。
答案 6 :(得分:0)
除非您知道其地址,否则我不认为其O(1) 必须删除的节点.....您是否循环到达必须从头部删除的节点????
如果您具有必须删除的节点的地址,则为O(1),因为您具有上一个节点链接和下一个节点链接。 当您拥有所有必需的链接时,只需重新排列链接,然后将其free()使其移出列表,即可使“感兴趣的节点”不在列表中。
但是在单个链接列表中,您必须从头开始遍历以获取上一个和下一个地址,无论您是否拥有要删除的节点的地址或节点位置(如第1、2、10号一样)等。)要删除。
答案 7 :(得分:0)
假设存在一个从1到10的链表,并且您必须删除为其指定位置的节点5。
1 -> 2 -> 3 -> 4 -> 5-> 6-> 7-> 8 -> 9 -> 10
您必须连接下一个指针4到6才能删除5。
4->next = 5->next;
或
Node* temp = givenNode->prev;
temp->next = givenNode->next;
时间复杂度= O(1)
Node* temp = head;
while(temp->next != givenNode)
{
temp = temp->next;
}
temp->next = givenNode->next;
时间复杂度= O(N)