我正在编写一个链表数据类型,因此我目前有一个引用第一项的标准头部指针,然后每个元素都有一个指向下一个元素的下一个指针,以便最后一个元素具有 next = NULL。
我只是好奇跟踪最后一个节点的优缺点或最佳实践是什么。我可以有一个"尾部"指针,它总是指向最后一个节点,使其易于追加,或者我可以从头部指针开始循环列表以在我想追加时找到最后一个节点。哪种方法更好?
通常最好存放尾巴。如果我们考虑在末尾添加项目的复杂性(如果这是您通常执行的操作),那么搜索尾巴将是 O(n) 时间,如果您存储它,则为 O(1)。
您可以考虑的另一种选择是使您的列表双重链接。这样,当你想删除列表的末尾时,通过存储尾巴,你可以在O(1)时间内删除节点。但这会导致列表的每个元素存储一个额外的指针(不昂贵,但它加起来,应该是内存受限系统的考虑因素)。
最后,这一切都与您需要执行的操作有关。如果您从不添加或删除或从列表末尾进行操作,则没有理由这样做。我建议分析您最常见操作的复杂性,并以此为基础做出决定。
取决于您需要查找最后一个节点的频率,但通常最好有一个tail
指针。
仅保留和更新tail
指针的成本很小,但您必须记住更新它!如果您可以保持更新,那么它将使追加操作更快(O(1)
而不是O(n)
)。因此,如果您通常将元素添加到列表的末尾,那么您绝对应该创建和维护tail
指针。
如果你有一个双向链表,其中每个元素都包含一个指向next
和prev
元素的指针,那么tail
指针几乎是普遍使用的。
另一方面,如果这是一个排序列表,那么您将不会追加到末尾,因此永远不会使用tail
指针。尽管如此,保留指针仍然是一个好主意,以防万一您决定将来需要它。