Implementering af LinkedList i Java
Det er tid til at udfordre dig selv med nogle virkelig komplekse opgaver.
Vi vil implementere vores forenklede datastruktur—specifikt SinglyLinkedList.
Lad os begynde med at implementere Node-klassen, som skal gemme en værdi og en reference til den næste Node.
Node.java
123456789class Node { int data; Node next; public Node(int data) { this.data = data; this.next = null; } }
Implementeringen af Node-klassen i SinglyLinkedList blev allerede demonstreret i det forrige kapitel, så vi vil ikke dvæle ved den længe.
Dernæst opretter vi SinglyLinkedList-klassen, hvor vi definerer al logikken for vores datastruktur:
SinglyLinkedList.java
1234567public class SinglyLinkedList { private Node head; public SinglyLinkedList() { this.head = null; } }
Vi oprettede feltet Node head, som vil gemme det første element i vores datastruktur.
I en almindelig LinkedList findes der også en head og tail, som gemmer henholdsvis det første og sidste element i datastrukturen. Da datastrukturen skal være tom ved initialisering, sætter vi dette felt til null i konstruktøren.
Vores datastruktur skal understøtte alle CRUD-operationer.
Opret
Lad os derfor gå trin for trin og skrive en metode til at tilføje et element til slutningen af listen, hvilket repræsenterer Create-operationen:
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; } }
Ovenfor kan du se implementeringen af metoden til at tilføje et element til slutningen af listen. Lad os gennemgå, hvordan denne metode fungerer:
-
Vi opretter et objekt af klassen
Node,newNode, og initialiserer det gennem konstruktøren, hvor vi videregiverdatafra parametrene iappend()-metoden; -
Dernæst tjekker vi om listen er tom, og hvis den er, erstatter vi det første element i listen (
head) mednewNodeved omfordeling; -
Derefter tilføjer vi en
return-sætning for at afslutte metoden; -
Hvis listen ikke er tom, opretter vi i denne metode et nyt objekt,
current, som repræsentererNode headi denne sammenhæng; -
Ved hjælp af en
while-løkke gennemløber vi hele listen, indtilcurrent.nexternull, hvilket betyder, at vi har fastslået, at det næste element i listen er tomt; -
Når vi finder det sidste ikke-null element i listen, sætter vi dets link til
newNodeog tilføjer dermed elementet til vores liste.
Med andre ord var målet med append-metoden at sætte linket for det sidste element til det nye element. På denne måde tilføjer vi et nyt element til listen.
Læs
Lad os fortsætte; nu skal vi implementere Read-operationen.
SinglyLinkedList.java
12345678public void display() { Node current = head; while (current != null) { System.out.print(current.data + " "); current = current.next; } System.out.println(); }
-
Read-operationen er ret enkel. Det er nødvendigt at iterere gennem hvert element i listen og udskrive dem på skærmen. I dette tilfælde anvendes også pladsholderen
current, som initialiseres medNode head; -
Dernæst angives betingelsen for while-løkken til
current != nullog feltetdataudskrives på skærmen; -
Til iteration gennem listen anvendes referencen ved at tildele
currentpå ny, hvilket ser således ud:current = current.next;; -
Dette gentages, indtil
Node currentbliver tom. Herefter afsluttes løkken, og næste linje udføres.
Overvej i øvrigt hvordan denne while-løkke kan erstattes med en do-while-løkke. Er det overhovedet muligt?
Opdatering
Lad os nu gå videre til opdateringsmetoden, som er mere interessant i sin implementering:
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; }
-
Først kontrollerer vi, om denne
indexfindes i vores liste ved hjælp af enif-sætning. Hvis ikke, udskrives beskeden "Invalid index", og metoden afsluttes. Dette gøres for at undgå fejl; -
Hvis indekset er inden for grænserne af vores liste, fortsætter vi med den velkendte algoritme. Først opretter vi et objekt af klassen
Nodekaldetcurrent, som vi initialiserer somhead; -
I stedet for at bruge en
while-løkke, anvender vi enfor-løkke, som er mere velegnet her, da vi kender det præcise antal iterationer, vi har brug for. Antallet af iterationer er lig med værdien af parameterenindex; -
Vores løkke ser således ud:
for (int i = 0; i < index; i++). I denne løkke finder vi det ønskede element ved hjælp af den velkendte operation:current = current.next; -
Når vi har fundet det ønskede element, tildeler vi dets
data-attribut en ny værdi ved at udføre operationencurrent.data = newData. Vi henternewDatafra parametrene til denne metode.
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat
Can you show me the code for the append method?
How would you implement the read operation in code?
Can you explain how the update method works with an example?
Fantastisk!
Completion rate forbedret til 4
Implementering af LinkedList i Java
Stryg for at vise menuen
Det er tid til at udfordre dig selv med nogle virkelig komplekse opgaver.
Vi vil implementere vores forenklede datastruktur—specifikt SinglyLinkedList.
Lad os begynde med at implementere Node-klassen, som skal gemme en værdi og en reference til den næste Node.
Node.java
123456789class Node { int data; Node next; public Node(int data) { this.data = data; this.next = null; } }
Implementeringen af Node-klassen i SinglyLinkedList blev allerede demonstreret i det forrige kapitel, så vi vil ikke dvæle ved den længe.
Dernæst opretter vi SinglyLinkedList-klassen, hvor vi definerer al logikken for vores datastruktur:
SinglyLinkedList.java
1234567public class SinglyLinkedList { private Node head; public SinglyLinkedList() { this.head = null; } }
Vi oprettede feltet Node head, som vil gemme det første element i vores datastruktur.
I en almindelig LinkedList findes der også en head og tail, som gemmer henholdsvis det første og sidste element i datastrukturen. Da datastrukturen skal være tom ved initialisering, sætter vi dette felt til null i konstruktøren.
Vores datastruktur skal understøtte alle CRUD-operationer.
Opret
Lad os derfor gå trin for trin og skrive en metode til at tilføje et element til slutningen af listen, hvilket repræsenterer Create-operationen:
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; } }
Ovenfor kan du se implementeringen af metoden til at tilføje et element til slutningen af listen. Lad os gennemgå, hvordan denne metode fungerer:
-
Vi opretter et objekt af klassen
Node,newNode, og initialiserer det gennem konstruktøren, hvor vi videregiverdatafra parametrene iappend()-metoden; -
Dernæst tjekker vi om listen er tom, og hvis den er, erstatter vi det første element i listen (
head) mednewNodeved omfordeling; -
Derefter tilføjer vi en
return-sætning for at afslutte metoden; -
Hvis listen ikke er tom, opretter vi i denne metode et nyt objekt,
current, som repræsentererNode headi denne sammenhæng; -
Ved hjælp af en
while-løkke gennemløber vi hele listen, indtilcurrent.nexternull, hvilket betyder, at vi har fastslået, at det næste element i listen er tomt; -
Når vi finder det sidste ikke-null element i listen, sætter vi dets link til
newNodeog tilføjer dermed elementet til vores liste.
Med andre ord var målet med append-metoden at sætte linket for det sidste element til det nye element. På denne måde tilføjer vi et nyt element til listen.
Læs
Lad os fortsætte; nu skal vi implementere Read-operationen.
SinglyLinkedList.java
12345678public void display() { Node current = head; while (current != null) { System.out.print(current.data + " "); current = current.next; } System.out.println(); }
-
Read-operationen er ret enkel. Det er nødvendigt at iterere gennem hvert element i listen og udskrive dem på skærmen. I dette tilfælde anvendes også pladsholderen
current, som initialiseres medNode head; -
Dernæst angives betingelsen for while-løkken til
current != nullog feltetdataudskrives på skærmen; -
Til iteration gennem listen anvendes referencen ved at tildele
currentpå ny, hvilket ser således ud:current = current.next;; -
Dette gentages, indtil
Node currentbliver tom. Herefter afsluttes løkken, og næste linje udføres.
Overvej i øvrigt hvordan denne while-løkke kan erstattes med en do-while-løkke. Er det overhovedet muligt?
Opdatering
Lad os nu gå videre til opdateringsmetoden, som er mere interessant i sin implementering:
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; }
-
Først kontrollerer vi, om denne
indexfindes i vores liste ved hjælp af enif-sætning. Hvis ikke, udskrives beskeden "Invalid index", og metoden afsluttes. Dette gøres for at undgå fejl; -
Hvis indekset er inden for grænserne af vores liste, fortsætter vi med den velkendte algoritme. Først opretter vi et objekt af klassen
Nodekaldetcurrent, som vi initialiserer somhead; -
I stedet for at bruge en
while-løkke, anvender vi enfor-løkke, som er mere velegnet her, da vi kender det præcise antal iterationer, vi har brug for. Antallet af iterationer er lig med værdien af parameterenindex; -
Vores løkke ser således ud:
for (int i = 0; i < index; i++). I denne løkke finder vi det ønskede element ved hjælp af den velkendte operation:current = current.next; -
Når vi har fundet det ønskede element, tildeler vi dets
data-attribut en ny værdi ved at udføre operationencurrent.data = newData. Vi henternewDatafra parametrene til denne metode.
Tak for dine kommentarer!