【问题标题】:iterating through queue with circular linked lists使用循环链表遍历队列
【发布时间】:2012-05-07 17:01:42
【问题描述】:

我必须使用只有一个迭代器的循环链表来实现一个队列。我的疑问是在性能方面哪个是更好的方法,维护第一项或最后一项的迭代器?

【问题讨论】:

  • 这是要求。我最多只能维护一个迭代器。

标签: c++ linked-list queue


【解决方案1】:

好吧,如果你有一个指向第一项的指针,那么对列表末尾的操作将是 O(N)。使用指向列表末尾的指针,您可以在 O(1) 中对开头和结尾进行操作。一般来说,如果你有一个循环链表,那么你希望能够到达开头和结尾,所以答案是使用指向结尾的指针你的性能会更好。

【讨论】:

  • 如果是双联的,那么整个是对称的,所以没关系……
  • 我不明白。我们如何在 o(1) 的开头和结尾进行操作。即使指针位于列表末尾,我们也必须迭代对吗?
  • 这是一个循环列表,所以如果你有一个指向末尾的指针,那么你可以通过它的next指针访问列表的开头。但正如 Oli 指出的那样,如果你有一个双向链表,那么你也可以通过 prev 指针从头开始访问结尾。
  • @OliCharlesworth 通常,循环链表是单链表。原因是为了节省空间开销(以及一些时间开销)。人们通常选择循环链表,因为所有的动作都在链表的末尾。当您希望能够从列表中间删除一个元素(或在一个元素之前插入)时,通常使用双向链表,而您所拥有的只是一个指向该元素的指针。此外,虽然双向链表当然可以是循环的,但很少需要这样做。
  • @OliCharlesworth 我不知道,queueu.h 中的 BSD LIST 似乎也是循环的。我仍然认为双向链表是否选择循环是恕我直言,主要是一种风格选择,很少需要它。循环双向链表的唯一好处是您可以保存一个指针(您只需要一个头指针而不是头和尾指针),我想如果您有很多空列表,可能会有所作为。边界情况的代码也发生了变化,但根据我的经验,我认为没有任何简化。
猜你喜欢
  • 2017-12-18
  • 1970-01-01
  • 2013-03-19
  • 1970-01-01
  • 2019-09-07
  • 2013-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多