在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类来实现这个目标?
由于
答案 0 :(得分:3)
标准库LinkedList
不允许您这样做。 remove(int)
不需要移动元素,但它确实需要查找要删除的列表节点,这需要线性时间。您可以使用迭代器,但Java迭代器失效比C ++迭代器失效更具攻击性。通过位于该元素的迭代器移除一个元素后,任何其他迭代器都将失效。
您可能需要编写自己的LinkedList
课程。
答案 1 :(得分:0)
没有人说操纵前一个和下一个指针在链接列表中花费了O(n)时间。它找到了使其成为O(n)的元素。
如果你有其中一个"迭代器" (对于列表中的每个元素,它们可能不会被称为),您仍然必须经历这些中的每一个"迭代器"找到列表中任何随机对象的那个。这是O(n)操作。
找到正确的对象后,更新上一个和下一个元素不依赖于元素的数量,因此无论语言如何,它都是O(n)。
答案 2 :(得分:0)
使用迭代器找到项目后,您可以在其上调用remove()
并删除O(1)
中的元素,但这仅在您未修改列表或使用支持并发更新的列表。