Me he estado preguntando sobre esto desde hace bastante tiempo y no he encontrado una buena respuesta a eso todavía en SO.
Lo que quiero hacer es encontrar un elemento en una lista enlazada y eliminarlo inmediatamente. Si construí la lista enlazada por mi cuenta, que sería fácil, ya que Ijust recorrido de la lista doblemente enlazada:
-> N1 <-> N2 <-> N3 <-> N4 <-> N5 <-
y cuando encuentre por ejemplo, N3, cambia los punteros node.previous y node.next tal que:
-> N1 <-> N2 <-> N4 <-> N5 <-
Si el elemento de en medio, esto requeriría aproximadamente n / 2 pasos.
¿Hay un enfoque adecuado para hacer esto en java.util.LinkedList<Integer>
?
Un enfoque que no es suficiente para mí es:
Integer found = null;
for(Integer elem : list){
if(hasCertainProperty(elem)){
found = elem;
}
}
if(found != null){
list.remove(found);
}
Si el elemento es el elemento medio en la lista (lista doblemente enlazada, por lo que la búsqueda de final de la lista es teóricamente posible si se conoce índice) que requeriría un máximo de aproximadamente n / 2 + n / 2 = n pasos. Mientras que en la poligonal hecho a sí mismo que sólo necesitaría n / 2 pasos.
Sé que los otros 2 y enfoques están en O (n), pero ya sabes, a veces de que n / 2 hace una diferencia en la práctica.
Gracias por tu ayuda.
Java 8 lo hará por ti.
list.removeIf(x -> hasCertainProperty(x));
Este bucles internamente a través de la lista, los controles para cada elemento x
si satisface su condición hasCertainProperty
, y elimina el elemento. Supongo que no debe preocuparse por el rendimiento. Java lo manejará para usted.
Aparte de eso, se debe utilizar ListIterator
la cual fue hecho precisamente para ese propósito. Se puede obtener mediante el uso de ListaEnlazada # listIterator :
ListIterator<Integer> listIter = list.listIterator(0);
while (listIter.hasNext()) {
Integer element = listIter.next();
if (hasCertainProperty(element)) {
listIter.remove();
break;
}
}
Su remove
no necesita ninguna consulta, ya que mantiene un puntero al nodo, mientras que la iteración. Por lo que tiene las manos en el nodo que desea eliminar.