链表的一致性检查

时间:2014-05-08 10:24:23

标签: algorithm linked-list big-o consistency

首先,链表中的列表不变量究竟是什么?

如何使用在O(n)时间和O(1)额外内存中运行的算法检查链表是否一致?

1 个答案:

答案 0 :(得分:2)

在双向链表中,不变量是每个节点都是其后继者的前身。

考虑一个实现,其中每个节点维护两个指针,一个succ指针指向其后继节点,一个pred指针指向其前任节点。

在正确的列表中,指针的布局如下:

doubly linked list with 3 nodes

请注意,当您从一个节点到下一个节点执行succ指针时,您始终可以使用pred指针返回到原始节点。操作列表的每个操作都必须确保此条件保持不变。

违反此不变量的列表可能如下所示:

doubly linked list with broken invariant

例如,如果错误实现的插入操作试图在列表中间插入节点n2,但忘记更新pred的{​​{1}}指针,则会发生这种情况。 / p>

检查此不变量非常简单:通过遍历n3指针(succ)遍历列表,并将最后访问的节点保留在内存缓冲区(O(n))中。然后在每个节点检查当前节点的O(1)指针是否指向最后访问的节点。

如果您也知道列表的结束节点,请检查您到达的最后一个节点(没有后继节点)是否是预期的结束节点。

请注意,使用单个链接列表时,不存在此类不变量。