Implementering av LinkedList i Java
Det er på tide å utfordre deg selv med noen virkelig komplekse oppgaver.
Vi skal implementere vår forenklede datastruktur—spesifikt, SinglyLinkedList.
La oss starte med å implementere Node-klassen, som skal lagre en verdi og en referanse til neste Node.
Node.java
123456789class Node { int data; Node next; public Node(int data) { this.data = data; this.next = null; } }
Implementasjonen av Node-klassen i SinglyLinkedList ble allerede demonstrert i forrige kapittel, så vi vil ikke bruke mye tid på dette.
Deretter lager vi klassen SinglyLinkedList, hvor vi definerer all logikken for vår datastruktur:
SinglyLinkedList.java
1234567public class SinglyLinkedList { private Node head; public SinglyLinkedList() { this.head = null; } }
Vi opprettet feltet Node head, som skal lagre det første elementet i vår datastruktur.
I en vanlig LinkedList finnes det også en head og tail som lagrer henholdsvis det første og siste elementet i datastrukturen. Siden datastrukturen skal være tom ved initialisering, setter vi dette feltet til null i konstruktøren.
Vår datastruktur må støtte alle CRUD-operasjoner.
Opprett
La oss gå gjennom dette steg for steg og skrive en metode for å legge til et element på slutten av listen, som representerer Create-operasjonen:
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 ser du implementasjonen av metoden for å legge til et element på slutten av listen. La oss se nærmere på hvordan denne metoden fungerer:
-
Vi oppretter et objekt av
Node-klassen,newNode, og initialiserer det gjennom konstruktøren, hvor vi sender inndatafra parameterne tilappend()-metoden; -
Deretter sjekker vi om listen er tom, og hvis den er det, erstatter vi det første elementet i listen (
head) mednewNodeved omtilordning; -
Så legger vi til en
return-setning for å avslutte metoden; -
Hvis listen ikke er tom, oppretter vi i denne metoden et nytt objekt,
current, som representererNode headi denne sammenhengen; -
Ved å bruke en
while-løkke itererer vi gjennom hele listen tilcurrent.nexternull, altså til vi har funnet ut at neste element i listen er tomt; -
Når vi finner det siste ikke-null-elementet i listen, setter vi lenken til dette elementet til
newNode, og legger dermed til elementet i listen vår.
Med andre ord var målet med append-metoden å sette lenken til det siste elementet til det nye elementet. På denne måten legger vi til et nytt element i listen.
Les
La oss gå videre; nå må vi implementere leseoperasjonen.
SinglyLinkedList.java
12345678public void display() { Node current = head; while (current != null) { System.out.print(current.data + " "); current = current.next; } System.out.println(); }
-
Leseoperasjonen er ganske enkel. Vi må iterere gjennom hvert element i listen og skrive dem ut på skjermen. I vårt tilfelle bruker vi også plassholderen
current, som vi initialiserer medNode head; -
Deretter setter vi betingelsen for while-løkken til
current != nullog skriver utdata-feltet på skjermen; -
For å iterere gjennom listen bruker vi referansen ved å tilordne på nytt
current, som ser slik ut:current = current.next;; -
Dette gjør vi til
Node currentblir tom. Etter dette går vi ut av løkken og fortsetter til neste linje.
Forresten, tenk på hvordan du kan erstatte denne while-løkken med en do-while-løkke. Er det mulig i det hele tatt?
Oppdatering
Nå går vi videre til oppdateringsmetoden, som er mer interessant i sin implementasjon:
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 sjekker vi om denne
indexfinnes i listen vår ved hjelp av enif-setning. Hvis ikke, skriver vi ut meldingen "Invalid index" og avslutter metoden. Dette gjøres for å unngå feil; -
Hvis indeksen er innenfor grensene til listen vår, fortsetter vi med den kjente algoritmen. Først oppretter vi et objekt av klassen
Nodekaltcurrent, som vi initialiserer somhead; -
I stedet for å bruke en
while-løkke, bruker vi enfor-løkke, som er mer egnet her siden vi vet det eksakte antallet iterasjoner vi trenger. Antallet iterasjoner er lik verdien til parameterenindex; -
Løkken vår ser slik ut:
for (int i = 0; i < index; i++). I denne løkken finner vi det ønskede elementet ved hjelp av den kjente operasjonen:current = current.next; -
Når vi har funnet det ønskede elementet, tildeler vi dets
data-attributt en ny verdi, og utfører operasjonencurrent.data = newData. Vi henternewDatafra parameterne til denne metoden.
Takk for tilbakemeldingene dine!
Spør AI
Spør AI
Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår
Fantastisk!
Completion rate forbedret til 4
Implementering av LinkedList i Java
Sveip for å vise menyen
Det er på tide å utfordre deg selv med noen virkelig komplekse oppgaver.
Vi skal implementere vår forenklede datastruktur—spesifikt, SinglyLinkedList.
La oss starte med å implementere Node-klassen, som skal lagre en verdi og en referanse til neste Node.
Node.java
123456789class Node { int data; Node next; public Node(int data) { this.data = data; this.next = null; } }
Implementasjonen av Node-klassen i SinglyLinkedList ble allerede demonstrert i forrige kapittel, så vi vil ikke bruke mye tid på dette.
Deretter lager vi klassen SinglyLinkedList, hvor vi definerer all logikken for vår datastruktur:
SinglyLinkedList.java
1234567public class SinglyLinkedList { private Node head; public SinglyLinkedList() { this.head = null; } }
Vi opprettet feltet Node head, som skal lagre det første elementet i vår datastruktur.
I en vanlig LinkedList finnes det også en head og tail som lagrer henholdsvis det første og siste elementet i datastrukturen. Siden datastrukturen skal være tom ved initialisering, setter vi dette feltet til null i konstruktøren.
Vår datastruktur må støtte alle CRUD-operasjoner.
Opprett
La oss gå gjennom dette steg for steg og skrive en metode for å legge til et element på slutten av listen, som representerer Create-operasjonen:
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 ser du implementasjonen av metoden for å legge til et element på slutten av listen. La oss se nærmere på hvordan denne metoden fungerer:
-
Vi oppretter et objekt av
Node-klassen,newNode, og initialiserer det gjennom konstruktøren, hvor vi sender inndatafra parameterne tilappend()-metoden; -
Deretter sjekker vi om listen er tom, og hvis den er det, erstatter vi det første elementet i listen (
head) mednewNodeved omtilordning; -
Så legger vi til en
return-setning for å avslutte metoden; -
Hvis listen ikke er tom, oppretter vi i denne metoden et nytt objekt,
current, som representererNode headi denne sammenhengen; -
Ved å bruke en
while-løkke itererer vi gjennom hele listen tilcurrent.nexternull, altså til vi har funnet ut at neste element i listen er tomt; -
Når vi finner det siste ikke-null-elementet i listen, setter vi lenken til dette elementet til
newNode, og legger dermed til elementet i listen vår.
Med andre ord var målet med append-metoden å sette lenken til det siste elementet til det nye elementet. På denne måten legger vi til et nytt element i listen.
Les
La oss gå videre; nå må vi implementere leseoperasjonen.
SinglyLinkedList.java
12345678public void display() { Node current = head; while (current != null) { System.out.print(current.data + " "); current = current.next; } System.out.println(); }
-
Leseoperasjonen er ganske enkel. Vi må iterere gjennom hvert element i listen og skrive dem ut på skjermen. I vårt tilfelle bruker vi også plassholderen
current, som vi initialiserer medNode head; -
Deretter setter vi betingelsen for while-løkken til
current != nullog skriver utdata-feltet på skjermen; -
For å iterere gjennom listen bruker vi referansen ved å tilordne på nytt
current, som ser slik ut:current = current.next;; -
Dette gjør vi til
Node currentblir tom. Etter dette går vi ut av løkken og fortsetter til neste linje.
Forresten, tenk på hvordan du kan erstatte denne while-løkken med en do-while-løkke. Er det mulig i det hele tatt?
Oppdatering
Nå går vi videre til oppdateringsmetoden, som er mer interessant i sin implementasjon:
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 sjekker vi om denne
indexfinnes i listen vår ved hjelp av enif-setning. Hvis ikke, skriver vi ut meldingen "Invalid index" og avslutter metoden. Dette gjøres for å unngå feil; -
Hvis indeksen er innenfor grensene til listen vår, fortsetter vi med den kjente algoritmen. Først oppretter vi et objekt av klassen
Nodekaltcurrent, som vi initialiserer somhead; -
I stedet for å bruke en
while-løkke, bruker vi enfor-løkke, som er mer egnet her siden vi vet det eksakte antallet iterasjoner vi trenger. Antallet iterasjoner er lik verdien til parameterenindex; -
Løkken vår ser slik ut:
for (int i = 0; i < index; i++). I denne løkken finner vi det ønskede elementet ved hjelp av den kjente operasjonen:current = current.next; -
Når vi har funnet det ønskede elementet, tildeler vi dets
data-attributt en ny verdi, og utfører operasjonencurrent.data = newData. Vi henternewDatafra parameterne til denne metoden.
Takk for tilbakemeldingene dine!