Вы не можете удалить объект из LinkedList
в O (1), если все, что у вас есть, это ссылка на сам объект.
Вы можете удалить объект, если удерживаете объект 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>
и сохранение ссылки на узел для последующего удаления остается вашим лучшим вариантом с чисто связаннымиlists.
Другой вариант - использование LinkedHashSet<E>
, которое предлагает предсказуемый порядок перечисления и O (1) удаления в обмен на использование дополнительной памяти.