Java: la mejor manera de encontrar y eliminar un elemento de lista enlazada

R Andi:

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.

La mediana Hilal:

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 xsi 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 ListIteratorla 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 removeno 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.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=120034&siteId=1
Recomendado
Clasificación