从O(1) - Java vs C ++中删除链表中的任何元素

时间:2016-04-16 20:16:04

标签: java c++ list time-complexity

在C ++中,我有时会将对象存储在链表中。我会将对象与指向其位置的迭代器相关联。然后,给定迭代器,我可以在O(1)时间从链表中删除对象。操作是O(1),因为列表只更新指向列表中上一个和下一个元素的指针。我正在谈论的C ++方法:http://www.cplusplus.com/reference/list/list/erase/

有没有办法在Java中使用相同的O(1)复杂度?

LinkedList似乎会转移后续元素:https://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html#remove(int)

也许有一个不同的Java类来实现这个目标?

由于

3 个答案:

答案 0 :(得分:3)

标准库LinkedList不允许您这样做。 remove(int)不需要移动元素,但它确实需要查找要删除的列表节点,这需要线性时间。您可以使用迭代器,但Java迭代器失效比C ++迭代器失效更具攻击性。通过位于该元素的迭代器移除一个元素后,任何其他迭代器都将失效。

您可能需要编写自己的LinkedList课程。

答案 1 :(得分:0)

没有人说操纵前一个和下一个指针在链接列表中花费了O(n)时间。它找到了使其成为O(n)的元素。

如果你有其中一个"迭代器" (对于列表中的每个元素,它们可能不会被称为),您仍然必须经历这些中的每一个"迭代器"找到列表中任何随机对象的那个。这是O(n)操作。

找到正确的对象后,更新上一个和下一个元素不依赖于元素的数量,因此无论语言如何,它都是O(n)。

答案 2 :(得分:0)

使用迭代器找到项目后,您可以在其上调用remove()并删除O(1)中的元素,但这仅在您未修改列表或使用支持并发更新的列表。