【问题标题】:Linked List - Appending node: loop or pointer?链表 - 附加节点:循环还是指针?
【发布时间】:2013-09-22 05:18:31
【问题描述】:

我正在编写一个链表数据类型,因此我目前有一个标准头指针,它引用第一项,然后每个元素都有一个指向下一个元素的下一个指针,这样最后一个元素的下一个 = NULL。

我只是好奇跟踪最后一个节点的优点/缺点或最佳实践是什么。我可以有一个“尾”指针,它始终指向最后一个节点,以便于追加,或者我可以从头指针开始循环遍历列表,以便在我想追加时找到最后一个节点。哪种方法更好?

【问题讨论】:

    标签: c data-structures linked-list


    【解决方案1】:

    存储尾部通常是个好主意。如果我们考虑在末尾添加项目的复杂性(如果这是您通常执行的操作),则搜索尾部将是 O(n) 时间,如果存储它则为 O(1)。

    您可以考虑的另一个选择是使您的列表双向链接。这样,当您想删除列表的末尾时,通过存储 tail 您可以在 O(1) 时间内删除节点。但这会导致为列表的每个元素存储一个额外的指针(并不昂贵,但它会加起来,并且应该是内存受限系统的考虑因素)。

    归根结底,这一切都与您需要执行的操作有关。如果您从不从列表末尾添加或删除或操作,则没有理由这样做。我建议您分析最常见操作的复杂性,并以此为基础做出决定。

    【讨论】:

    • 还要考虑存储冗余指针的额外成本。如果您的列表很长,最终可能会占用很大的内存。
    【解决方案2】:

    取决于您需要多久找到最后一个节点,但一般来说最好有一个tail 指针。

    只保留和更新tail 指针的成本很低,但您必须记住更新它!如果您可以保持更新,那么它将使追加操作大大更快(O(1) 而不是O(n))。因此,如果您通常将元素添加到列表的末尾,那么您绝对应该创建并维护一个tail 指针。

    如果你有一个双向链表,其中每个元素都包含一个指向next prev 元素的指针,那么几乎普遍使用tail 指针。

    另一方面,如果这是一个 排序 列表,那么您将不会追加到末尾,因此永远不会使用 tail 指针。不过,保留指针是个好主意,以防万一您决定将来需要它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 2021-12-02
      • 2014-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      相关资源
      最近更新 更多