双链路队列在单链路队列上是否有任何优势?

时间:2017-11-29 13:05:39

标签: data-structures queue

我被要求实施双链接队列。但我知道单链接队列很简单,所有主要功能都在big-Theta 1中运行。我基本上是在谈论FIFO实现(不包括像deque这样的特殊队列)。我见过其他人使用双链接实现实现队列,我知道这会消耗更多的存储空间,因为每个节点需要2个指针(prev& next)。双链路队列在单链路队列上是否有任何优势?!

2 个答案:

答案 0 :(得分:0)

优点是您可以在双向链接列表上向任一方向迭代。 此外,如果数据对象相当大,那么额外的内存开销不是很大的百分比。

答案 1 :(得分:0)

您不需要双头LL上的双倍LL。双头LL(具有指向头和尾的指针)就足够了。

对于FIFO,主要操作是入队和出队。用链表术语来说,这是add_to_end和remove_from_front。这两个都是带有双链表的O(1)操作。

如果您需要一个既可以用作队列又可以用作堆栈的数据结构,那么您将需要一个双向链表来进行O(1)操作。没有双向链接列表的O(n)的主要操作是remove_from_end / pop。这样做的原因是,您将不得不从最后一个节点(在下面的示例中为node3)中查找前一个节点,将其设置为末尾,然后删除其指向要删除的节点的指针。对于双倍的LL,找到这个节点就像tail.prev一样简单。但是,对于双端LL,您必须进行O(n)遍历才能找到该节点。

前1-2-3-4后

def remove_from_end():
# get node4 and remove node4 from being the tail. O(1) time as you have a pointer to the tail in a double ended LL.
# set tail node3 and remove the .next from node3 to node4. If you don't have .prev on node4, then it would take O(n) to find node3