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