Doppelt verkettete Liste
Eine doppelt verkettete Liste speichert prev und next. Damit sind Einfügen und Löschen $O(1)$, sobald der Knoten bekannt ist, weil der Vorgänger ohne Suche erreichbar ist.
Kosten: mehr Speicher und mehr Invarianten (beide Richtungen konsistent halten). Am Kopf und am Ende sind Sentinel-Knoten hilfreich.
java.util.LinkedList ist doppelt verkettet und eignet sich für häufige Einfüge-/Löschoperationen an den Enden.
Wo gebraucht
LRU-Caches (Knoten bei Zugriff nach vorn hängen), Deques, Browser-History, Texteditor-Rope-Varianten. $O(1)$ Entfernen bei bekanntem Knoten ist der Produktgrund für die doppelte Verkettung.
Vertiefung
Jeder Knoten besitzt Verweise auf Vorgänger und Nachfolger. Für benachbarte Knoten gilt als Invariante, dass Vorwärts- und Rückwärtsverweis zueinander passen. Änderungen müssen beide Richtungen aktualisieren.
Ist ein Knoten bereits bekannt, kann er lokal entfernt werden, ohne seinen Vorgänger durch Suche zu bestimmen. Der Indexzugriff bleibt jedoch linear. Ein gespeicherter Endverweis erlaubt zusätzlich konstantes Einfügen und Entfernen am hinteren Ende.
Wächter an beiden Enden reduzieren Sonderfälle. Leere und nichtleere Zustände verwenden dann dieselben vier Verweisaktualisierungen, während die Wächter selbst nie Nutzdaten darstellen.
Schwierigkeitsstufen
- Vorwärts- und Rückwärtsinvarianten prüfen.
- Einen bekannten inneren Knoten sicher entfernen.
- Wächterknoten gegen explizite Randfallbehandlung abwägen.
Fallstricke
Nur eine Richtung zu aktualisieren erzeugt eine Struktur, die in einem Durchlauf korrekt und im Rückwärtslauf beschädigt wirkt. Entfernte Knoten sollten ausserdem von ihren Nachbarn getrennt werden.
Tasks
Card Info
- Topic: Algorithmen und Datenstrukturen
- Difficulty: Intermediate
- Completed: 0 users