Java: bester Weg, ein Element aus verketteten Liste zu finden und zu entfernen

Andi R:

Ich habe schon seit geraumer Zeit darüber schon gewundert, und haben keine gute Antwort auf diese noch auf SO gefunden.

Was ich tun möchte, ist ein Element in einer verknüpften Liste zu finden und sofort löschen. Wenn ich die verknüpfte Liste auf meinem eigenen konstruiert, wäre es leicht, da Ijust die doppelt verknüpfte Liste durchlaufen:

-> N1 <-> N2 <-> N3 <-> N4 <-> N5 <-

und wenn Sie zB N3 finden, ändern Sie die node.previous und node.next Zeiger, so dass:

-> N1 <-> N2 <-> N4 <-> N5 <-

Wenn das Element in der Mitte, würde dies etwa n / 2 Schritte erfordern.

Gibt es einen richtigen Ansatz , um dies zu tun in java.util.LinkedList<Integer>?

Ein Ansatz, der nicht ausreichend ist für mich ist:

Integer found = null;
for(Integer elem : list){
    if(hasCertainProperty(elem)){
        found = elem;
    } 
}
if(found != null){
    list.remove(found);
}

Wenn das Element das mittlere Element in der Liste ist (Doppel Liste verknüpft, so von Ende der Liste suchen ist theoretisch möglich, wenn der Index bekannt ist) ist es ein Maximum von etwa n / 2 + n / 2 = n Schritten erfordern würde. Während in der selbstgemachten Traverse wäre es nur noch n / 2 Stufen.

Ich weiß, diese 2 und anderen Ansätze sind in O (n), aber man weiß ja, manchmal, dass n / 2 einen Unterschied in der Praxis macht.

Danke für Ihre Hilfe.

Median Hilal:

Java 8 wird dies für Sie tun.

list.removeIf(x -> hasCertainProperty(x));

Diese intern Schleifen durch die Liste, Schecks für jedes Element , xob es erfüllt Ihr Zustand hasCertainProperty, und entfernt das Element. Ich denke , man sollte nicht über die Leistung betroffen sein. Java wird es für Sie.

Abgesehen davon sollten Sie ListIteratordie genau zu diesem Zweck gemacht wurde. Sie erhalten sie unter Verwendung LinkedList # ListIterator :

ListIterator<Integer> listIter = list.listIterator(0);
while (listIter.hasNext()) {
    Integer element = listIter.next();

    if (hasCertainProperty(element)) {
        listIter.remove();
        break;
    }
}

Seine removebraucht keine Lookup, da es einen Zeiger auf den Knoten während Iterieren hält. So hat es die Hände auf den Knoten , den Sie entfernen möchten.

Ich denke du magst

Origin http://43.154.161.224:23101/article/api/json?id=120024&siteId=1
Empfohlen
Rangfolge