![](/img/trans.png)
[英]Time Complexity while deleting last element from arraylist and linkedlist
[英]Given the pointer, deleting an element from a LinkedList collection
我有一个对象的LinkedList
,以及一个指向要删除的LinkedList
对象的指针。
有一个方法remove(object o)
,可以用来删除一个对象,但是正如文档所描述的,它一步一步地检查所有元素,并选择一个在语义上相同的对象。
但是这种方法不符合我的要求。
因为我有一个指向要删除的对象的指针,所以我应该能够在O(1)
时间内删除它,因为LinkedList
是一个双向链接列表。 还有其他方法可以实现我自己的LinkedList
类吗?
如果您仅拥有对对象本身的引用,则无法从O(1)的LinkedList
中删除对象。
如果将ListIterator<E>
对象保持在要删除的项目上,则可以删除该对象,方法是在迭代器上调用remove()
,但这没有多大用处,因为在列表出现时迭代器将失效被修改。
这是一个如何保持去除量O(1)的示例。 搜索仍然为O(n),但:
List<String> list = new LinkedList<>();
list.add("hello");
list.add("world");
list.add("one");
list.add("two");
list.add("three");
System.out.println(Arrays.toString(list.toArray()));
ListIterator<String> iter = list.listIterator();
String s;
while ((s = iter.next()) != null && !s.equals("world"))
;
// When it is time to delete
iter.remove();
System.out.println(Arrays.toString(list.toArray()));
由于ConcurrentModificationException
,编写纯链接列表的最佳选择是编写自己的LinkedList<E>
并保留对节点的引用以供将来删除。
您的另一个选择是使用LinkedHashSet<E>
,它提供可预测的枚举顺序和O(1)删除,以换取更多的内存。
怎么样:
public void remove(Car searchedFor) {
for (Iterator<Car> it = list.iterator(); it.hasNext(); ) {
Car c = it.next;
if (c == searchedFor) {
it.remove();
}
}
}
一个很好的解决方案是同时使用List
和HashSet
。 由于我们使用的是HashSet
,因此无法使用重复项。
插入:同时插入List
和HashSet
。 O(1)
时间。
删除:从HashSet
删除(如果存在)。 O(1)
时间。
遍历:遍历List
。 仅在HashSet
包含该对象时访问。
请注意,我不是在这里尝试复制LinkedList
的工作。 我只是分享对我有用的东西。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.