Pointers 为什么从双链接列表中删除节点要比从单链接列表中删除节点快?

Pointers 为什么从双链接列表中删除节点要比从单链接列表中删除节点快?,pointers,data-structures,linked-list,big-o,time-complexity,Pointers,Data Structures,Linked List,Big O,Time Complexity,我很好奇为什么从双链接列表中删除节点要比从单链接列表中删除节点快。根据我的讲座,双链表需要O(1),而单链表需要O(n)。根据我的思考过程,我认为它们都应该是O(n),因为你必须遍历可能所有的元素,所以这取决于大小 我知道这与每个节点都有一个前一个指针和一个指向下一个节点的下一个指针这一事实有关,我只是不明白它如何成为O(1)意义上的常量操作这部分取决于你如何解释设置。这里有两个不同的版本 版本1:假设要从单链或双链列表中删除包含特定值x的链表节点,但不知道该节点在列表中的位置。在这种情况下,您

我很好奇为什么从双链接列表中删除节点要比从单链接列表中删除节点快。根据我的讲座,双链表需要O(1),而单链表需要O(n)。根据我的思考过程,我认为它们都应该是O(n),因为你必须遍历可能所有的元素,所以这取决于大小


我知道这与每个节点都有一个前一个指针和一个指向下一个节点的下一个指针这一事实有关,我只是不明白它如何成为O(1)意义上的常量操作这部分取决于你如何解释设置。这里有两个不同的版本

版本1:假设要从单链或双链列表中删除包含特定值x的链表节点,但不知道该节点在列表中的位置。在这种情况下,您必须遍历列表,从开始处开始,直到找到要删除的节点。在单链表和双链表中,您可以在O(1)时间内删除它,因此整个运行时为O(n)。也就是说,在单链表中执行删除步骤比较困难,因为需要更新前一个单元格中的指针(要删除的单元格没有指向该指针),所以在执行此操作时需要存储两个指针

版本2:现在让我们假设您得到一个指向要删除的单元格的指针,并且需要删除它。在双链接列表中,可以通过使用“下一个”和“上一个”指针来标识要删除的单元格周围的两个单元格,然后重新布线以将单元格从列表中拼接出来。这需要时间O(1)。但是单链表呢?要从列表中删除此单元格,必须更改要删除的单元格之前显示的单元格的下一个指针,使其不再指向要删除的单元格。不幸的是,您没有指向该单元格的指针,因为该列表只是单独链接的。因此,您必须从列表的开头开始,向下遍历节点,找到要删除的节点之前的节点。这需要时间O(n),因此在最坏的情况下,删除步骤的运行时是O(n),而不是O(1)。(也就是说,如果您知道两个指针—您要删除的单元格和它前面的单元格,那么您可以在O(1)时间内删除该单元格,因为您不必扫描列表来查找前面的单元格。)

简而言之:如果您事先知道要删除的单元格,则双链接列表允许您在时间O(1)内删除它,而单链接列表则需要时间O(n)。如果你事先不知道这个细胞,那么在这两种情况下都是O(n)


希望这有帮助

在双链接列表中,无需遍历列表即可将上一个节点连接到下一个节点。你只要指出

curr.Prev.Next=curr.Next
curr.Next.Prev=curr.Prev


在单个链接列表中,必须遍历列表才能找到上一个节点。在未排序的列表中,遍历可以是O(n)。

@arshajii-我实际上是指O(1),但它是不明确的。移除节点的实际步骤是O(1),但要找到它,需要提前做O(n)个工作。我刚刚编辑了答案来澄清这一点。非常感谢!!如果我理解正确的话,需要O(n)(最坏情况),因为在一个单链表中,一旦我们找到元素,我们没有对上一个节点的引用,因此我们无法更改它的下一个节点,将其从列表中删除,因此我们必须再次遍历列表以获取上一个单元格pointer@JoshHamet-只有知道要删除的节点但不知道之前的节点时,才需要执行遍历。可能的重复