【问题标题】:doubly linked list empty situation双向链表空情况
【发布时间】:2014-05-16 00:48:15
【问题描述】:

在我的演讲中,如果双向链表为空,那么

header.next==tail;

或者

tail.prev==header; 

但我觉得恰好有两个节点时就是这种情况。空壳不应该是 head==null.
我不知道我是否正确。我对这个主题还很陌生。有人可以澄清一下吗

【问题讨论】:

    标签: java data-structures doubly-linked-list


    【解决方案1】:

    有两种常用的方式来存储双链表:

    • headtail 引用树中的实际节点。

      head variable       tail variable
        |                   |
        V                   V
      first -> second -> third -> null
      

      在这种情况下,您是正确的 - head 将是 null

    • headtail 成为特殊节点(称为"sentinel nodes",正如另一个答案中所指出的那样)实际上不包含任何数据并通过@987654329 指向列表中的第一个和最后一个节点分别是@和prev

      head variable                       tail variable
        |                                   |
        V                                   V
      head -> first -> second -> third -> tail -> null
      node                                node
      

      在这种情况下,header.next == tail 表示列表为空。

      人们可能会使用这种方法而不是上面的方法来稍微简化实现并使代码更快一些 - 无需为删除或插入第一个或最后一个节点做出特殊规定。

    【讨论】:

    • 谢谢。我们没有被教导过哨兵。在注释中给出了“”双向链表有一个引用,header指向序列中的第一个节点和一个引用,tail,指向序列的最后一个结尾”。在这种情况下,我认为虽然给出了哨兵方法的代码,因为 head 和 tail 指的是树中的实际节点,但正确一个是head==null
    • 是的,我同意你关于暗示 head==null 的措辞表示一个空列表,但也可能是措辞错误。
    【解决方案2】:

    这个双向链表同时使用了头部和尾部sentinel nodes。这些节点实际上并不包含列表的元素,但通过使头部和尾部情况更像列表的中间部分来帮助使某些算法稍微好一点。

    如果列表不使用标记,则空大小写为head==null,二元素大小写为header.next==tailtail.prev==header

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-12
      • 1970-01-01
      • 2013-11-15
      • 2013-09-29
      • 1970-01-01
      • 1970-01-01
      • 2019-06-03
      相关资源
      最近更新 更多