Implementierung von LinkedList in Java
Es ist an der Zeit, sich mit einigen wirklich komplexen Aufgaben zu fordern.
Wir werden unsere vereinfachte Datenstruktur implementieren – genauer gesagt, die SinglyLinkedList.
Beginnen wir mit der Implementierung der Node-Klasse, die einen Wert und eine Referenz auf den nächsten Node speichert.
Node.java
123456789class Node { int data; Node next; public Node(int data) { this.data = data; this.next = null; } }
Die Implementierung der Node-Klasse in SinglyLinkedList wurde bereits im vorherigen Kapitel gezeigt, daher werden wir hier nicht weiter darauf eingehen.
Als Nächstes erstellen wir die Klasse SinglyLinkedList, in der wir die gesamte Logik für unsere Datenstruktur definieren:
SinglyLinkedList.java
1234567public class SinglyLinkedList { private Node head; public SinglyLinkedList() { this.head = null; } }
Wir haben das Feld Node head erstellt, das das erste Element unserer Datenstruktur speichert.
In einer gewöhnlichen LinkedList gibt es ebenfalls ein head und ein tail, die das erste und das letzte Element der Datenstruktur speichern. Da die Datenstruktur bei der Initialisierung leer sein sollte, setzen wir dieses Feld im Konstruktor auf null.
Unsere Datenstruktur muss alle CRUD-Operationen unterstützen.
Erstellen
Gehen wir Schritt für Schritt vor und schreiben eine Methode, um ein Element am Ende der Liste hinzuzufügen, was die Create-Operation darstellt:
SinglyLinkedList.java
12345678910111213141516171819202122public class SinglyLinkedList { private Node head; public SinglyLinkedList() { this.head = null; } public void append(int data) { Node newNode = new Node(data); if (head == null) { head = newNode; return; } Node current = head; while (current.next != null) { current = current.next; } current.next = newNode; } }
Oben ist die Implementierung der Methode zu sehen, mit der ein Element am Ende der Liste hinzugefügt wird. Im Folgenden wird erläutert, wie diese Methode funktioniert:
-
Es wird ein Objekt der Klasse
Node,newNode, erstellt und über den Konstruktor initialisiert, wobei diedataaus den Parametern der Methodeappend()übergeben werden; -
Anschließend wird geprüft, ob die Liste leer ist. Falls ja, wird das erste Element der Liste (
head) durchnewNodeersetzt; -
Danach wird eine
return-Anweisung hinzugefügt, um die Methode zu beenden; -
Falls die Liste nicht leer ist, wird in dieser Methode ein neues Objekt
currenterstellt, das in diesem Kontext denNode headrepräsentiert; -
Mit einer
while-Schleife wird die gesamte Liste durchlaufen, biscurrent.nextnullist, also bis festgestellt wird, dass das nächste Element in der Liste leer ist; -
Sobald das letzte nicht-leere Element in der Liste gefunden wurde, wird dessen Verweis auf
newNodegesetzt, wodurch das Element zur Liste hinzugefügt wird.
Mit anderen Worten: Das Ziel der Append-Methode war es, den Verweis des letzten Elements auf das neue Element zu setzen. So wird ein neues Element zur Liste hinzugefügt.
Lesen
Kommen wir zum nächsten Schritt; nun müssen wir die Leseoperation implementieren.
SinglyLinkedList.java
12345678public void display() { Node current = head; while (current != null) { System.out.print(current.data + " "); current = current.next; } System.out.println(); }
-
Die Leseoperation ist recht einfach. Es ist erforderlich, durch jedes Element der Liste zu iterieren und diese auf dem Bildschirm auszugeben. In diesem Fall wird auch der Platzhalter
currentverwendet, der mit demNode headinitialisiert wird; -
Anschließend wird die Bedingung für die
current != null-Schleife aufdatagesetzt und das Feldcurrentauf dem Bildschirm ausgegeben; -
Für die Iteration durch die Liste wird die Referenz durch erneute Zuweisung von
current = current.next;verwendet, was wie folgt aussieht:Node current; -
Dies wird solange wiederholt, bis der
whileleer ist. Danach wird die Schleife verlassen und zur nächsten Zeile übergegangen.
Überlegen Sie übrigens, wie diese while-Schleife durch eine do-while-Schleife ersetzt werden könnte. Ist das überhaupt möglich?
Aktualisieren
Kommen wir nun zur Update-Methode, deren Implementierung besonders interessant ist:
SinglyLinkedList.java
12345678910111213public void update(int index, int newData) { if (index < 0 || index >= size()) { System.out.println("Invalid index"); return; } Node current = head; for (int i = 0; i < index; i++) { current = current.next; } current.data = newData; }
-
Zunächst wird überprüft, ob sich dieser
indexin unserer Liste befindet, indem eineif-Anweisung verwendet wird. Falls nicht, wird die Meldung "Invalid index" ausgegeben und die Methode beendet. Dies dient zur Fehlervermeidung; -
Befindet sich der Index innerhalb der Grenzen unserer Liste, wird mit dem bekannten Algorithmus fortgefahren. Zuerst wird ein Objekt der Klasse
Nodemit dem Namencurrenterstellt, das alsheadinitialisiert wird; -
Anstelle einer
while-Schleife wird einefor-Schleife verwendet, da diese hier besser geeignet ist, weil die exakte Anzahl der Iterationen bekannt ist. Die Anzahl der Iterationen entspricht dem Wert des Parametersindex; -
Die Schleife sieht folgendermaßen aus:
for (int i = 0; i < index; i++). In dieser Schleife wird das gewünschte Element mit der bekannten Operation gefunden:current = current.next; -
Nachdem das gewünschte Element gefunden wurde, wird dessen Attribut
datamit einem neuen Wert belegt, indem die Operationcurrent.data = newDataausgeführt wird. Der WertnewDatawird aus den Parametern dieser Methode übernommen.
Danke für Ihr Feedback!
Fragen Sie AI
Fragen Sie AI
Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen
Großartig!
Completion Rate verbessert auf 4
Implementierung von LinkedList in Java
Swipe um das Menü anzuzeigen
Es ist an der Zeit, sich mit einigen wirklich komplexen Aufgaben zu fordern.
Wir werden unsere vereinfachte Datenstruktur implementieren – genauer gesagt, die SinglyLinkedList.
Beginnen wir mit der Implementierung der Node-Klasse, die einen Wert und eine Referenz auf den nächsten Node speichert.
Node.java
123456789class Node { int data; Node next; public Node(int data) { this.data = data; this.next = null; } }
Die Implementierung der Node-Klasse in SinglyLinkedList wurde bereits im vorherigen Kapitel gezeigt, daher werden wir hier nicht weiter darauf eingehen.
Als Nächstes erstellen wir die Klasse SinglyLinkedList, in der wir die gesamte Logik für unsere Datenstruktur definieren:
SinglyLinkedList.java
1234567public class SinglyLinkedList { private Node head; public SinglyLinkedList() { this.head = null; } }
Wir haben das Feld Node head erstellt, das das erste Element unserer Datenstruktur speichert.
In einer gewöhnlichen LinkedList gibt es ebenfalls ein head und ein tail, die das erste und das letzte Element der Datenstruktur speichern. Da die Datenstruktur bei der Initialisierung leer sein sollte, setzen wir dieses Feld im Konstruktor auf null.
Unsere Datenstruktur muss alle CRUD-Operationen unterstützen.
Erstellen
Gehen wir Schritt für Schritt vor und schreiben eine Methode, um ein Element am Ende der Liste hinzuzufügen, was die Create-Operation darstellt:
SinglyLinkedList.java
12345678910111213141516171819202122public class SinglyLinkedList { private Node head; public SinglyLinkedList() { this.head = null; } public void append(int data) { Node newNode = new Node(data); if (head == null) { head = newNode; return; } Node current = head; while (current.next != null) { current = current.next; } current.next = newNode; } }
Oben ist die Implementierung der Methode zu sehen, mit der ein Element am Ende der Liste hinzugefügt wird. Im Folgenden wird erläutert, wie diese Methode funktioniert:
-
Es wird ein Objekt der Klasse
Node,newNode, erstellt und über den Konstruktor initialisiert, wobei diedataaus den Parametern der Methodeappend()übergeben werden; -
Anschließend wird geprüft, ob die Liste leer ist. Falls ja, wird das erste Element der Liste (
head) durchnewNodeersetzt; -
Danach wird eine
return-Anweisung hinzugefügt, um die Methode zu beenden; -
Falls die Liste nicht leer ist, wird in dieser Methode ein neues Objekt
currenterstellt, das in diesem Kontext denNode headrepräsentiert; -
Mit einer
while-Schleife wird die gesamte Liste durchlaufen, biscurrent.nextnullist, also bis festgestellt wird, dass das nächste Element in der Liste leer ist; -
Sobald das letzte nicht-leere Element in der Liste gefunden wurde, wird dessen Verweis auf
newNodegesetzt, wodurch das Element zur Liste hinzugefügt wird.
Mit anderen Worten: Das Ziel der Append-Methode war es, den Verweis des letzten Elements auf das neue Element zu setzen. So wird ein neues Element zur Liste hinzugefügt.
Lesen
Kommen wir zum nächsten Schritt; nun müssen wir die Leseoperation implementieren.
SinglyLinkedList.java
12345678public void display() { Node current = head; while (current != null) { System.out.print(current.data + " "); current = current.next; } System.out.println(); }
-
Die Leseoperation ist recht einfach. Es ist erforderlich, durch jedes Element der Liste zu iterieren und diese auf dem Bildschirm auszugeben. In diesem Fall wird auch der Platzhalter
currentverwendet, der mit demNode headinitialisiert wird; -
Anschließend wird die Bedingung für die
current != null-Schleife aufdatagesetzt und das Feldcurrentauf dem Bildschirm ausgegeben; -
Für die Iteration durch die Liste wird die Referenz durch erneute Zuweisung von
current = current.next;verwendet, was wie folgt aussieht:Node current; -
Dies wird solange wiederholt, bis der
whileleer ist. Danach wird die Schleife verlassen und zur nächsten Zeile übergegangen.
Überlegen Sie übrigens, wie diese while-Schleife durch eine do-while-Schleife ersetzt werden könnte. Ist das überhaupt möglich?
Aktualisieren
Kommen wir nun zur Update-Methode, deren Implementierung besonders interessant ist:
SinglyLinkedList.java
12345678910111213public void update(int index, int newData) { if (index < 0 || index >= size()) { System.out.println("Invalid index"); return; } Node current = head; for (int i = 0; i < index; i++) { current = current.next; } current.data = newData; }
-
Zunächst wird überprüft, ob sich dieser
indexin unserer Liste befindet, indem eineif-Anweisung verwendet wird. Falls nicht, wird die Meldung "Invalid index" ausgegeben und die Methode beendet. Dies dient zur Fehlervermeidung; -
Befindet sich der Index innerhalb der Grenzen unserer Liste, wird mit dem bekannten Algorithmus fortgefahren. Zuerst wird ein Objekt der Klasse
Nodemit dem Namencurrenterstellt, das alsheadinitialisiert wird; -
Anstelle einer
while-Schleife wird einefor-Schleife verwendet, da diese hier besser geeignet ist, weil die exakte Anzahl der Iterationen bekannt ist. Die Anzahl der Iterationen entspricht dem Wert des Parametersindex; -
Die Schleife sieht folgendermaßen aus:
for (int i = 0; i < index; i++). In dieser Schleife wird das gewünschte Element mit der bekannten Operation gefunden:current = current.next; -
Nachdem das gewünschte Element gefunden wurde, wird dessen Attribut
datamit einem neuen Wert belegt, indem die Operationcurrent.data = newDataausgeführt wird. Der WertnewDatawird aus den Parametern dieser Methode übernommen.
Danke für Ihr Feedback!