【发布时间】:2012-12-12 10:58:57
【问题描述】:
我不太明白为什么像wikipedia article 所说的那样,在单个链表末尾删除需要花费 O(1) 时间。
单个链表由节点组成。一个节点包含某种数据,以及对下一个节点的引用。链表中最后一个节点的引用为空。
-------------- -------------- --------------
| data | ref | -> | data | ref | -> ... -> | data | ref |
-------------- -------------- --------------
我可以删除 O(1) 中的最后一个节点。但在这种情况下,您不会将新的最后一个节点(前一个节点)的引用设置为 null,因为它仍然包含对已删除的最后一个节点的引用。所以我想知道,他们在运行时间分析中是否忽略了这一点?还是认为您不必更改它,因为引用只是指向任何内容,而这被视为空值?
因为如果不忽略它,我会认为删除是 O(n)。由于您必须遍历整个列表才能到达新的最后一个节点并将其引用也设置为 null。只有在双链表中才会真正是 O(1)。
-编辑- 或许这种观点能更清楚一些。但我将“删除节点”视为成功删除节点本身并将先前的引用设置为 null。
【问题讨论】:
-
我在 Wikipedia 文章中看到了两个对 O(1) 的引用,但它们都没有声明删除单链表中的最后一个节点是 O(1) 操作。据推测,您在尝试删除时已经持有指向前一个节点的指针,这是删除除第一个节点以外的任何节点所必需的。
标签: data-structures linked-list singly-linked-list