【问题标题】:Circular doubly linked list and Tail pointer doubly linked list循环双向链表和尾指针双向链表
【发布时间】:2013-11-15 20:56:17
【问题描述】:

使用循环指针和尾指针构建双向链表的优点/缺点是什么?哪个更适合构建双端队列?

在我看来,它们在执行所有搜索、插入和删除节点时几乎相同。唯一不同的是,对于尾指针双向链表,需要有一个尾指针指向最后一个节点,并且每次在尾后插入新节点时都需要更新它。此外,在循环链表中,第一个节点链接到最后一个节点,反之亦然,而在尾指针中,head->prev 和 tail-> 都指向空指针。 我认为它们都非常适合构建双端队列。这一切都归结为您希望程序如何运行。如果你想让你的程序在头尾节点之间快速来回运行,使用循环的方法,否则,尾指针就足够了。

这就是我对这个问题的回答。由于我还没有建立任何循环双向链表,我对它如何在机器上运行没有任何经验,但我怀疑它会和尾指针一样快。有什么建议吗?感谢大家的投入。

【问题讨论】:

    标签: linked-list


    【解决方案1】:

    循环双链表可能是首选,因为您可以有效地从开头或结尾添加/删除,并且它使用简单的统一数据结构。

    实现循环 dbl 链表的最简单方法是保存与所有其他节点相同类型的“头”节点,但始终具有“空”项/值,仅用于保存下一个/上一个指向实际“项目节点”的指针。

    当列表为空时,head.next 和 head.prev 都会指向自身。

    循环 dbl 链表的逻辑更简单,而不是尾指针变体,允许 'head' 和 'tail' 为空时为空;这需要在任何修改操作中都可能更新“头”和“尾”指针,从而使逻辑更加复杂。

    这里的命名有点不清楚:我使用head 来指代“列表节点”,但它可以称为“列表”或“节点”。

    head.next -> first -> second -> ...
    head.last -> last -> second-last -> ...
    

    如果列表为空:

    head.next -> head
    head.last -> head
    

    如果列表只有一项:

    head.next -> item -> head
    head.last -> item -> head
    

    【讨论】:

    • 循环双向链表头部前后插入节点的算法是什么?他们不一样吗?因为在循环链表中,你实际上根本不跟踪尾部,最后一个节点可以连接到第一个节点,反之亦然>
    • 在任何地方插入节点的算法是相同的,你需要一个'prev'参数并在之后插入。要先插入,请传递“head”。最后插入,你通过'head.prev'。插入函数必须更新前一个的next指针,下一个的prev指针,并设置插入节点的next/prev指针。工作完成。
    猜你喜欢
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    • 2010-11-11
    相关资源
    最近更新 更多