LinkedList-Toteutus Javassa
Pyyhkäise näyttääksesi valikon
On aika haastaa itsesi todella monimutkaisilla tehtävillä.
Toteutamme yksinkertaistetun tietorakenteemme—tarkemmin sanottuna SinglyLinkedList-rakenteen.
Aloitetaan toteuttamalla Node-luokka, joka tallentaa arvon ja viitteen seuraavaan Node-olioon.
Node.java
123456789class Node { int data; Node next; public Node(int data) { this.data = data; this.next = null; } }
Node-luokan toteutus SinglyLinkedList-rakenteessa esiteltiin jo edellisessä luvussa, joten emme käsittele sitä tässä tarkemmin.
Seuraavaksi luodaan SinglyLinkedList-luokka, jossa määritellään kaikki tietorakenteen logiikka:
SinglyLinkedList.java
1234567public class SinglyLinkedList { private Node head; public SinglyLinkedList() { this.head = null; } }
Kenttä Node head luotiin tallentamaan tietorakenteen ensimmäinen alkio.
Tavallisessa LinkedList-rakenteessa on myös head ja tail, jotka tallentavat tietorakenteen ensimmäisen ja viimeisen alkion. Koska tietorakenteen tulee olla tyhjä alustettaessa, asetetaan tämä kenttä null-arvoon konstruktorissa.
Tietorakenteen tulee tukea kaikkia CRUD-operaatioita.
Luo
Käydään vaihe vaiheelta läpi, kuinka kirjoitetaan menetelmä, joka lisää alkion listan loppuun, mikä vastaa luontioperaatiota:
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; } }
Yllä näet menetelmän toteutuksen, jolla lisätään alkio listan loppuun. Tarkastellaan, miten tämä menetelmä toimii:
-
Luodaan
Node-luokan olio,newNode, ja alustetaan se konstruktorin avulla, välittäendataparametrinaappend()-menetelmälle; -
Seuraavaksi tarkistetaan, onko lista tyhjä, ja jos on, korvataan listan ensimmäinen alkio (
head)newNode:lla uudelleenasettamalla; -
Lisätään
return-lauseke menetelmästä poistumista varten; -
Jos lista ei ole tyhjä, tässä menetelmässä luodaan uusi olio,
current, joka edustaaNode headtässä yhteydessä; -
while-silmukkaa käyttäen iteraoidaan koko lista läpi, kunnescurrent.nextonnull, eli kunnes havaitaan, että listan seuraava alkio on tyhjä; -
Kun löydetään viimeinen ei-null alkio listasta, asetetaan sen linkki osoittamaan
newNode:iin, jolloin alkio lisätään listaan.
Toisin sanoen, append-menetelmän tarkoituksena oli asettaa viimeisen alkion linkki osoittamaan uuteen alkioon. Näin uusi alkio lisätään listaan.
Luku
Jatketaan eteenpäin; nyt meidän täytyy toteuttaa lukuoperaatio.
SinglyLinkedList.java
12345678public void display() { Node current = head; while (current != null) { System.out.print(current.data + " "); current = current.next; } System.out.println(); }
-
Lukuoperaatio on varsin yksinkertainen. Meidän täytyy iteraoida jokaisen listan alkion läpi ja tulostaa ne näytölle. Tässä tapauksessa käytämme myös väliaikaista muuttujaa
current, joka alustetaan arvollaNode head; -
Seuraavaksi asetamme ehdon while-silmukalle:
current != nullja tulostammedata-kentän näytölle; -
Listan läpikäyntiin käytämme viitteen uudelleenasettamista
current, joka näyttää tältä:current = current.next;; -
Toistamme tämän, kunnes
Node currenton tyhjä. Tämän jälkeen poistutaan silmukasta ja siirrytään seuraavalle riville.
Muuten, mieti kuinka korvata tämä while-silmukka do-while-silmukalla. Onko se ylipäätään mahdollista?
Päivittäminen
Seuraavaksi siirrytään päivitysmetodiin, jonka toteutus on mielenkiintoisempi:
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; }
-
Ensin tarkistetaan, onko tämä
indexlistassamme käyttämälläif-lausetta. Jos ei ole, tulostetaan viesti "Invalid index" ja metodi lopetetaan. Tämä tehdään virheiden välttämiseksi; -
Jos indeksi on listan rajojen sisällä, jatketaan tutulla algoritmilla. Ensin luodaan
Node-luokan olio nimeltäcurrent, joka alustetaanhead:ksi; -
while-silmukan sijaan käytetäänfor-silmukkaa, joka on tässä sopivampi, koska tiedetään tarkka toistojen määrä. Toistojen määrä on yhtä suuri kuinindex-parametrin arvo; -
Silmukka näyttää tältä:
for (int i = 0; i < index; i++). Tässä silmukassa etsitään haluttu alkio käyttämällä tuttua operaatiota:current = current.next; -
Kun haluttu alkio on löydetty, sen
data-attribuutille annetaan uusi arvo suorittamalla operaatiocurrent.data = newData.newDatasaadaan tämän metodin parametreista.
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme