循环双向链表和尾指针双向链表

时间:2013-11-05 03:09:14

标签: linked-list

使用循环指针和尾指针构建双向链表有什么好处/不足?哪一个更适合建立一个双端队列?

从我的观点来看,它们在执行所有搜索,插入和删除节点时几乎相同。唯一不同的是,对于尾指针双向链表,你需要有一个尾指针指向最后一个节点,每次在尾后插入一个新节点时都需要更新它。此外,在循环链表中,您有第一个节点链接到最后一个节点,反之亦然,而在尾部指针中,您同时具有head-> prev和tail->指向空指针。 我认为他们都对建立一个双端队员很感兴趣。这一切都取决于您希望程序如何运行。如果你希望你的程序能够快速地在头部和尾部节点之间来回运行,那么使用循环方法,否则,尾部指针应该足够了。

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

1 个答案:

答案 0 :(得分:1)

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

实现循环dbl链接列表的最简单方法是保存与所有其他节点相同类型的“head”节点,但始终具有“null”项/值并仅用于保存next / prev指向实际“项目节点”的指针。

当列表为空时,head.next& head.prev都指向自己。

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

这里的命名有点不清楚:我使用head来引用'list node',但它可以被称为'list'或'node'。

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

如果列表为空:

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

如果列表中有一个项目:

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