单链表&时间复杂性

时间:2012-12-08 20:01:43

标签: c++ list time-complexity

我正在尝试编写自己的(尽可能接近标准)单链表实现。但是我想知道人们对这样一个列表的期望时间是多少?

特别是对于插入我想知道我应该如何实现它。我读过互联网上的一些地方,有些人说插入是O(1)而有些人说是O(n) - 所有人都认为双重链表是O(1)。但是我认为O(1)也是单链表的情况呢?

只要您知道前面的节点,您只需让前面的节点指向新的节点,新节点将指向前一节点最初指向的位置。

那说它让我想知道人们期望insert的表现如何?通常它会在给定的迭代器之前插入元素。然而,对于单链表,很难这样做(必须经过O(n)时间才能得到前面的元素&然后使用上面的方法)。在这样的列表中常见的是使insert在当前迭代器后面放置项吗?或者 - 可能更好 - 是否有另一个常见的功能呢?

1 个答案:

答案 0 :(得分:3)

插入的复杂性取决于您需要做什么。如果你知道前面的节点(实际上,你需要一个合适的句柄来改变前面节点的“下一个指针”),复杂性是O(1)。如果您需要找到要插入的位置,则复杂度为O(n)

关于期望,我希望insert()的行为与双向链接列表的行为相同,但我也意识到你无法实现这一点:你需要有不同的时间复杂度(至找到前任节点)或不同的迭代器失效语义(即,其他节点的迭代器失效)。我认为C ++ 2011 std::forward_list类模板用于不同的接口,但保留了迭代器有效性的保证。

简要解释为什么迭代器有效性可以实现:迭代器不必只知道当前节点。相反,它可以,例如,指向前任的next指针。取消引用迭代器时,它首先取消引用指向next指针的指针,然后指向该指针以获取实际节点。作为回报,可以在迭代器前面插入,因为迭代器知道要更新的next指针。不幸的是,这意味着迭代器可能会失效,因为它们指向的指针可能已经改变,并且它们将引用不同的节点(当擦除节点时,迭代器可能已被移动为完全无效,尽管引用的节点仍然存在)。 / p>