faecher:informatik:oberstufe:adt:verkettete_liste:liste_java:start

Dies ist eine alte Version des Dokuments!


Eine verkettete Liste mit Java

Eine (verkettete) List ist ein linearer abstrakter Datentyp mit den folgenden Methoden:

  • Konstruktor List() – erzeugt eine leere Liste.
  • isEmpty(): boolean – gibt true zurück, wenn die Liste kein Element enthält, sonst wird false zurückgegeben.
  • length(): int – gibt die Anzahl der in der Liste enthaltenen Werte zurück. Eine leere Liste hat die Länge 0. Aufrufe von append und instertAt erhöhen die Anzahl um 1.
  • getValueAtN(n: int): T – gibt den Wert an der Position n in der Liste zurück. n muss dabei mindestens 0 und höchstens lenght()-1 sein. Falls dies nicht zutrifft, wird null zurückgegeben.
  • append(val: T) – fügt einen Wert am Ende der Liste ein. Der eingefügte Wert befindet sich nach dem Aufruf an der Stelle length()-1.
  • insertAt(index: int, val: T) – fügt einen Wert an der Position index ein. Jeder Wert, der sich hinter der Einfügestelle befindet, befindet sich nach dem Aufruf eine Position weiter hinten. index muss mindestens 0 und höchstens lenght() sein. Falls dies nicht zutrifft, wird die Liste nicht verändert. Der eingefügte Wert befindet sich nach dem Aufruf an der Stelle index.
  • hasValue(val: T): boolean – gibt true zurück, wenn die Liste einen Wert enthält, der gleich (im Sinne von equals) dem Wert val ist, sonst wird false zurückgegeben.
  • removeAt(index: int) – entfernt den Wert, der an der Stelle index in der Liste steht, aus der Liste. index muss mindestens 0 und höchstens length()-1 sein. Falls dies nicht zutrifft, wird die Liste nicht verändert.

Das Objektdiagramm einer Liste sieht folgendermaßen aus.

Die Liste besteht aus verketteten Listenknoten (Objekt: Node), jeder Knoten hat (mindestens) zwei Attribute: Eine Referenz auf die mit dem Knoten gespeicherten Daten (content) und eine Referenz auf den nächsten Listenknoten (nextNode). Das Listenobjekt liste01 mit seinen Methoden dient der Verwaltung der Knoten und damit der gespeicherten Daten.

Die Listenklasse muss mindestens über ein Attribut first verfügen, welches die Referenz auf das erste Knotenobjekt enthält, so dass ausgehend vom ersten Knoten jeder Listenknoten iterativ für weitere Operationen erreichbar ist.

Hinweise:

  • Liste und Knoten werden ist als generische Klassen implementiert und mit dem Typ-Parameter T parametrisiert, so dass man beliebige Java Objekte in der Liste verwalten kann.
  • Es gibt andere (komfortablere) Möglichkeiten Listen zu implementieren, wir beschränken uns zunächst auf das wesentliche und entwickeln das dann weiter.

Klone das Repo https://codeberg.org/qg-info-unterricht/verkettete-liste-java und bearbeite folgenden Aufgaben, um die Liste gemäß des obigen Implementatoinsdiagramms zu programmieren.


(A1) Die Klasse ''Node''

Die Klasse Node ist in der Vorlage bereits vollständig implementiert. Betrachte den Quellecode und mache dich mit Bedeutung und Funktionsweise der Methoden vertraut. Überprüfe besonders die Typen der Parameter und Rückgabewerte hinsichtlich der Parametrisierung der Klasse mit dem Typparameter T.


(A2) Konstruktor und die Methode ''isEmpty()''

Das Bild zeigt das Objektdiagramm einer leeren Liste. Füge der Klasse List einen Konstruktor hinzu, der eine solches Listenobjekt erzeugt. Teste den Konstruktor indem du ein Listenobjekt erzeugst und mit dem Objektinspektor untersuchst, ob er eine leere Liste wie gewünscht erzeugt.

Hilfe

Implementiere dann die Methode isEmpty. Welches Kriterium kannst du verwenden um festzustellen, dass die Liste leer ist? Verleiche das Objektdiagramm der leeren Liste mit dem der Liste mit Knoten oben auf der Seite.

Teste die Methode zunächst mit deiner leeren Liste.

Lösungsvorschlag


(A3) Die Methode "append"

Beim Anhängen eines weiteren Knotens an die Liste sind zwei Fälle zu unterscheiden:

  1. Die Liste ist leer
  2. Die Liste ist nicht leer

Liste leer

Wenn die Liste Leer ist, ist der Vorgang schnell beschrieben, eine Veranschaulichung findet sich im Diagramm unten.

  • Erzeuge eine neuen Knoten mit dem Nachfolger "null"
  • Setze das Attribut first der Liste auf den neuen Knoten

(A) Implementiere in der Methode append den Teil des Codes, der an eine leere Liste einen neuen Knoten anhängt. Die Methode isEmpty() ist hilfreich. Teste deine Methode von Hand, indem du eine Liste für Integer Zahlen erzeugst und einen Knoten in die leere Liste einfügst.


Liste nicht leer

Das folgende Objektdiagramm veranschaulicht die Schritte, die beim Anhängen eines neuen Knotens an eine nicht leere Liste auszuführen sind.

(B) Schreibe als Merksatz stichwortartig nieder, was beim Anhängen eines neuen Knotens alles passieren muss.

Bewegen in der Liste

Ein konkretes Problem stellt sich noch in Schritt 2 des Ablaufs zum Einfügen eines neuen Knotens: Wie können wir uns durch die Liste bewegen, wenn das Listenobjekt selbst nur die Referenz auf den ersten Knoten kennt?

Hier gehen wir ähnlich vor wie bei der Erhöhung einer Zählvariablen:

Zähler Liste
// Neuer Zähler
int i=0;
// Zählen bis 99
while (i < 100) {
   i++;
}
// Ende der Zahlenreihe erreicht, i = 99
// Knotenzeiger erzeugen, auf first setzen
Node<T> n = first;
// weitergehen bis zum Ende
while(n.getNext()!= null) {
    n = n.getNext();
}
// Jetzt zeigt current auf den letzten Knoten.

(C) Implementiere den zweiten Fall der Methode append entsprechend deiner Vorüberlegungen. Teste deine Methode von Hand, indem du eine Liste für Integer Zahlen erzeugst und 3 Knoten mit aufsteigenden Werten einfügst. Wenn du das Listenobjekt inspizierst, solltest du deine Werte in der korrekten Reihenfolge vorfinden.

Hilfe 1 zur Methode "anhaengen"

Hilfe 2 zur Methode "anhaengen"

Lösung zur Methode "anhaengen"


(A2) Die weiteren Methoden

Die weiteren Methoden kannst du unter Zuhilfenahme der Kenntnisse aus Aufgabe 1 sicherlich gut implementieren - die Schlüsselstellen sind "wie komme ich von einem Listenelement zum nächsten" und "wie verknüpfe ich neu hinzugekommene Listenelemente" - für beides findest du im Code zu Aufgabe 1 exemplarische Beispiele.

  • faecher/informatik/oberstufe/adt/verkettete_liste/liste_java/start.1634742365.txt.gz
  • Zuletzt geändert: 20.10.2021 15:06
  • von sbel