首先,链表中的列表不变量究竟是什么?
如何使用在O(n)时间和O(1)额外内存中运行的算法检查链表是否一致?
答案 0 :(得分:2)
在双向链表中,不变量是每个节点都是其后继者的前身。
考虑一个实现,其中每个节点维护两个指针,一个succ
指针指向其后继节点,一个pred
指针指向其前任节点。
在正确的列表中,指针的布局如下:
请注意,当您从一个节点到下一个节点执行succ
指针时,您始终可以使用pred
指针返回到原始节点。操作列表的每个操作都必须确保此条件保持不变。
违反此不变量的列表可能如下所示:
例如,如果错误实现的插入操作试图在列表中间插入节点n2
,但忘记更新pred
的{{1}}指针,则会发生这种情况。 / p>
检查此不变量非常简单:通过遍历n3
指针(succ
)遍历列表,并将最后访问的节点保留在内存缓冲区(O(n)
)中。然后在每个节点检查当前节点的O(1)
指针是否指向最后访问的节点。
如果您也知道列表的结束节点,请检查您到达的最后一个节点(没有后继节点)是否是预期的结束节点。
请注意,使用单个链接列表时,不存在此类不变量。