04. spa1 - kruzne liste
DESCRIPTION
bhTRANSCRIPT
KRUŽNE LISTE I
KRUŽNE LISTE SA GRANIČNIKOM
Strukture podataka i algoritmi 1
Kružne liste
Motivacija: bolje iskoristiti pokazivač poslednjeg
elementa
Može da pokazuje na prvi element umesto na null
Tada svi elementi postaju ravnopravni
Na koji element da pokazuje spoljašnji pokazivač?
pig dog rat cat
dog
Kružne liste
Java klasa koja implementira čvor kružne JPL:
public class CSLLNode {
Object element;
CSLLNode succ;
public CSLLNode (Object elem, CSLLNode
succ) {
this.element = elem;
this.succ = succ;
}
}
Kružne liste
Java klasa koja implementira zaglavlje kružne JPL:
Spoljašnji pokazivač će pokazivati na poslednji element u listi (zbog efikasnijeg ubacivanja na kraj)
public class CSLL {
CSLLNode last;
public CSLL () {
// Pravi praznu JPL.
this.last = null;
}
...
}
Prolazak kroz kružnu JPL
public void printFirstToLast () {
// Stampa sve elemente od prvog do poslednjeg.
if (last != null) {
CSLLNode curr = this.last.succ;
while (curr != this.last) {
System.out.println(curr.element);
curr = curr.succ;
}
System.out.println(curr.element);
}
}
Ubacivanje na početak
public void insertFirst (Object elem) {
// Ubacuje elem na pocetak liste
CSLLNode ins = new CSLLNode(elem, null);
if (this.last == null) {
ins.succ = ins;
this.last = ins;
} else {
ins.succ = this.last.succ;
this.last.succ = ins;
}
}
Ubacivanje na kraj
public void insertLast (Object elem) {
// Ubacuje elem na kraj liste
CSLLNode ins = new CSLLNode(elem, null);
if (this.last == null) {
ins.succ = ins;
} else {
ins.succ = this.last.succ;
this.last.succ = ins;
}
this.last = ins;
}
Brisanje prvog
public void deleteFirst() {
// Brise prvi element
if (this.last != null)
if (this.last.succ == this.last)
this.last = null;
else
this.last.succ = this.last.succ.succ;
}
Traženje elementa
public CSLLNode find (Object elem) {
// Pronalazi elem u JPL, vraca null ako elem ne postoji
if (this.last != null) {
CSLLNode curr = this.last.succ;
while (curr != this.last &&
!curr.element.equals(elem))
curr = curr.succ;
if (curr.element.equals(elem))
return curr;
else
return null;
} else
return null;
}
Kružne liste
Ostale operacije analogno kao kod “obične” JPL
Kružne liste sa graničnikom
Motivacija: da li je moguće izbeći posebne
slučajeve kod:
Ubacivanja u praznu listu
Izbacivanja elementa iz jednoelementne liste
Držimo u listi stalno jedan čvor koji nije element liste
Graničnik (stražar, zaglavlje)
Kružne liste sa graničnikom
Spoljašnji pokazivač pokazuje na graničnik
--- dog rat cat
---
---
dog
Kružne liste sa graničnikom
Java klasa koja implementira čvor kružne JPL:
public class CSLLNode {
Object element;
CSLLNode succ;
public CSLLNode (Object elem, CSLLNode
succ) {
this.element = elem;
this.succ = succ;
}
}
Kružne liste sa graničnikom
Java klasa koja implementira zaglavlje kružne JPL:
Spoljašnji pokazivač će pokazivati na graničnik koji se nalazi pre prvog i posle poslednjeg elementa
public class CSLLH {
CSLLNode header;
public CSLLH () {
// Pravi praznu JPL sa granicnikom.
this.header = new CSLLNode("", null);
this.header.succ = this.header;
}
...
}
Prolazak kroz kružnu JPL sa
graničnikom
public void printFirstToLast () {
// Stampa sve elemente od prvog do posl.
CSLLNode curr = this.header.succ;
while (curr != this.header) {
System.out.println(curr.element);
curr = curr.succ;
}
}
Ubacivanje na početak
public void insertFirst (Object elem) {
// Ubacuje elem na pocetak liste
CSLLNode ins = new CSLLNode(elem, null);
ins.succ = this.header.succ;
this.header.succ = ins;
}
Ubacivanje na kraj
public void insertLast (Object elem) {
// Ubacuje elem na kraj liste
CSLLNode ins = new CSLLNode("", null);
ins.succ = this.header.succ;
this.header.succ = ins;
this.header.element = elem;
this.header = ins;
}
Brisanje prvog
public void deleteFirst() {
// Brise prvi element
this.header.succ = this.header.succ.succ;
}
Da li ovo radi i kod prazne liste?
Traženje elementa
Stavimo element koji tražimo u graničnik
Prolazimo kroz listu dok ne nadjemo element
Pronalazimo ga sigurno barem u graničniku (nema
provere za kraj liste)
Ako smo stigli do graničnika – element ne postoji u listi
Inače – postoji, vraćamo pokazivač na nađeni čvor
Traženje elementa
public CSLLNode find (Object elem) {
// Pronalazi elem u JPL, vraca null ako // elem ne postoji
this.header.element = elem;
CSLLNode curr = this.header.succ;
while (!curr.element.equals(elem))
curr = curr.succ;
if (curr != this.header)
return curr;
else
return null;
}
Kružne liste sa graničnikom
Ostale operacije analogno kao kod “obične” JPL