【发布时间】:2016-06-07 08:05:30
【问题描述】:
为什么 C++ 标准库中std::list 类的反向函数具有线性运行时?我认为对于双向链表,反向函数应该是 O(1)。
反转双向链表应该只涉及切换头指针和尾指针。
【问题讨论】:
-
我不明白为什么人们不赞成这个问题。这是一个完全合理的问题。反转双向链表需要 O(1) 时间。
-
不幸的是,有些人混淆了“问题很好”和“问题有一个好主意”的概念。我喜欢这样的问题,基本上“我的理解似乎与普遍接受的做法不同,请帮助解决这个冲突”,因为扩展你的想法可以帮助你解决更多的问题!似乎其他人会采取“在 99.9999% 的情况下这是浪费处理,甚至不要考虑它”的方法。如果有什么安慰的话,我被否决的票要少得多!
-
是的,这个问题因其质量而受到过多的反对。可能与支持 Blindy 答案的人相同。公平地说,“反转双向链表应该只涉及切换头指针和尾指针”对于每个人在高中学习的标准链表 impl 或人们使用的许多实现通常都不正确。很多时候,人们对问题或答案的直接直觉反应推动了赞成/反对的决定。如果您在那句话中更清楚或省略它,我认为您会得到更少的反对票。
-
或者让我把举证责任交给你,@Curious:我在这里创建了一个双向链表实现:ideone.com/c1HebO。您能否指出您希望
Reverse函数在 O(1) 中的实现方式? -
@CompuChip:实际上,取决于实现,它可能不会。您不需要一个额外的布尔值来知道要使用哪个指针:只需使用一个不指向您的指针......顺便说一下,这很可能是使用异或链表自动实现的。所以是的,这取决于列表是如何实现的,并且可以澄清 OP 声明。
标签: c++ c++11 stl linked-list