Data structures 是否在O(1)中删除单链表中的中间节点?

Data structures 是否在O(1)中删除单链表中的中间节点?,data-structures,linked-list,Data Structures,Linked List,假设,我们需要删除LL中的一个中间节点,并给出指向该节点的指针,该指针将被删除 但是,我可以删除O(1)中的节点,因为指针指向该节点,但是为了将删除节点之前的节点输入到删除节点之后的节点,我需要遍历到O(N)元素 那么,如何将这种复杂性从总体上解释为O(1)。在某些情况下可以始终这样做吗?使用链表时,如果经常遇到这种情况,则使用不同的删除算法。您可以在链接列表元素中插入一个标志并将其标记为已删除,而不是调整删除指针。然后忽略带有删除标志的记录。这样的删除是O(1) 其他类型的实现也可能提供更好的

假设,我们需要删除LL中的一个中间节点,并给出指向该节点的指针,该指针将被删除

但是,我可以删除O(1)中的节点,因为指针指向该节点,但是为了将删除节点之前的节点输入到删除节点之后的节点,我需要遍历到O(N)元素


那么,如何将这种复杂性从总体上解释为O(1)。在某些情况下可以始终这样做吗?

使用链表时,如果经常遇到这种情况,则使用不同的删除算法。您可以在链接列表元素中插入一个标志并将其标记为已删除,而不是调整删除指针。然后忽略带有删除标志的记录。这样的删除是O(1)


其他类型的实现也可能提供更好的删除成本。但你对一般情况的分析是正确的。如果每个节点只有一个链接,并且没有其他改进,则删除为O(n)。

使用链接列表时,如果经常遇到这种情况,则使用不同的删除算法。您可以在链接列表元素中插入一个标志并将其标记为已删除,而不是调整删除指针。然后忽略带有删除标志的记录。这样的删除是O(1)


其他类型的实现也可能提供更好的删除成本。但你对一般情况的分析是正确的。如果每个节点只有一个链接,并且没有其他改进,则删除为O(n)。

假设我们有以下链接列表:

A->B->C->D->E
我们知道A的指针指向B,B的指针指向C,依此类推。比方说,您知道指向C的指针并打算删除它。新名单应为:

A->B->D->E
这里,B和D将被链接。显然,您可以从C的下一个指针获得D的地址。是的,我们有C的地址,但这并不意味着你一定知道B的指针。因此,您需要从头部遍历到节点(B),该节点的指针指向C。这说明了O(n)的复杂性,因为它取决于链表中节点“n”的数量。一旦你发现了B,你就可以把D的地址分配给它的下一个指针。因此,C从链表中删除


如果您知道要删除的节点之前的节点地址(在上述情况下为节点B),则复杂性可设为O(1)。

假设我们有以下链接列表:

A->B->C->D->E
我们知道A的指针指向B,B的指针指向C,依此类推。比方说,您知道指向C的指针并打算删除它。新名单应为:

A->B->D->E
这里,B和D将被链接。显然,您可以从C的下一个指针获得D的地址。是的,我们有C的地址,但这并不意味着你一定知道B的指针。因此,您需要从头部遍历到节点(B),该节点的指针指向C。这说明了O(n)的复杂性,因为它取决于链表中节点“n”的数量。一旦你发现了B,你就可以把D的地址分配给它的下一个指针。因此,C从链表中删除

如果您知道要删除的节点之前的节点地址(在上面的情况下是节点B),那么复杂性可能会增加到O(1)。

我记得有一个“解决方案”,您不实际删除您有指针指向的特定节点(我们称之为“B节点”),但您要做的是复制“下一个”节点(我们称之为“C节点”)的数据进入“B节点”,然后删除“C”节点,这样您就有了O(1)复杂性

A->B->C

  copy data from C to B . Delete C.
我记得有一个“解决方案”,你实际上没有删除你有指针指向的特定节点(我们称之为“B节点”),但你要做的是将“下一个”节点(我们称之为“C节点”)的数据复制到“B节点”中,然后删除“C”节点,这样你就有了O(1)的复杂性

A->B->C

  copy data from C to B . Delete C.

第一个是一个有趣的解决方案。如果知道它的缺点会是什么,那就太好了。一个明显的缺点是,如果频繁插入和删除列表,那么由于忽略了带有deleted标志的条目,列表就会变得太长。您需要通过不时删除删除的节点来压缩列表。第一个是一个有趣的解决方案。如果知道它的缺点会是什么,那就太好了。一个明显的缺点是,如果频繁插入和删除列表,那么由于忽略了带有deleted标志的条目,列表就会变得太长。您需要通过不时删除删除的节点来压缩列表。