package paz1b.task3;
/**
* Trieda zapuzdrujuca spajany zoznam a manipulaciu s nim
*/
public class SpajanyZoznam {
/**
* Sukromna trieda reprezentujuca jeden uzol spajaneho zoznamu
*/
private static class Uzol {
int hodnota;
Uzol dalsi;
}
/**
* Referencia na prvy uzol spajaneho zoznamu
*/
private Uzol prvy = null;
private Uzol posledny = null;
private int pocetPrvkov = 0;
public int getPocetPrvkov() {
return pocetPrvkov;
}
public void setPocetPrvkov(int pocetPrvkov) {
this.pocetPrvkov = pocetPrvkov;
}
private Uzol vratITy(int index) {
int pocitadlo = 0;
Uzol aktualny = prvy;
while (aktualny != null) {
if (pocitadlo == index)
return aktualny;
aktualny = aktualny.dalsi;
pocitadlo++;
}
throw new IndexOutOfBoundsException();
}
public int get(int index) {
/*
* Uzol vysledok = vratITy(index); return vysledok.hodnota;
*/
return vratITy(index).hodnota;
}
public void set(int index, int value) {
/*
* Uzol vysledok = vratITy(index); vysledok.hodnota = value;
*/
vratITy(index).hodnota = value;
}
/**
* Prida uzol so zadanou hodnotou na koniec spajaneho zoznamu
*/
public void add(int value) {
// vytvorim novy pridavany uzol
Uzol pridavany = new Uzol();
pridavany.hodnota = value;
pridavany.dalsi = null;
Uzol aktualny = prvy;
while (aktualny.dalsi != null) {
aktualny = aktualny.dalsi;
}
aktualny.dalsi = pridavany;
setPocetPrvkov(getPocetPrvkov() + 1);
posledny = pridavany;
}
/**
* Prida uzol so zadanou hodnotou na zadany index spajaneho zoznamu
*/
public void add(int index, int value) {
Uzol pridavany = new Uzol();
pridavany.hodnota = value;
if (index < 0)
throw new IndexOutOfBoundsException();
// ak index je = 0
if (index == 0)
pridajNaZaciatok(value);
// ak index > 0
else {
Uzol predchodca = vratITy(index - 1);
// pridavany sa pozera na rovnaky uzol ako predchodca
pridavany.dalsi = predchodca.dalsi;
// predchodca nech sa pozera na pridavany
predchodca.dalsi = pridavany;
setPocetPrvkov(getPocetPrvkov() + 1);
}
}
/**
* Odstrani uzol zo zadaneho indexu spajaneho zoznamu
*/
public void remove(int index) {
if (index < 0)
throw new IndexOutOfBoundsException();
// ak index = 0 posunieme prvy uzol na jeho nasledovnika
if (index == 0)
prvy = prvy.dalsi;
// ak index>0
else {
// nejdeme predchodcu odstranovaneho
Uzol predchodcaOdstranovaneho = vratITy(index - 1);
// obideme odstranovany prvok presmerovanim ukazovatelov
predchodcaOdstranovaneho.dalsi = predchodcaOdstranovaneho.dalsi.dalsi;
}
setPocetPrvkov(getPocetPrvkov() - 1);
if (pocetPrvkov - 1 == index) {
posledny = vratITy(index - 1);
}
}
/**
* Prida novu hodnotu na zaciatok spajaneho zoznamu
*
* @param hodnota pridavana hodnota
*/
public void pridajNaZaciatok(int hodnota) {
Uzol pridavany = new Uzol();
pridavany.hodnota = hodnota;
pridavany.dalsi = prvy;
prvy = pridavany;
if (pocetPrvkov == 1) {
posledny = prvy;
}
setPocetPrvkov(getPocetPrvkov() + 1);
}
@Override
public String toString() {
String vysledok = "[";
Uzol aktualny = prvy;
while (aktualny != null) {
if (aktualny != prvy)
vysledok += ", ";
vysledok += aktualny.hodnota;
aktualny = aktualny.dalsi;
}
return vysledok + "]";
}
/**
* Vrati sucet hodnot ulozenych v spajanom zozname
*/
public int sucet() {
// Referencia na uzol zoznamu, na ktorom sa prave nachadzame
Uzol aktualny = prvy;
// Premenna, v ktorej akumulujeme sucet
int vysledok = 0;
// Kym sme na nejakom uzle ...
while (aktualny != null) {
// Priratame hodnotu uzla
vysledok += aktualny.hodnota;
// Presunieme sa na dalsi uzol v zozname
aktualny = aktualny.dalsi;
}
return vysledok;
}
}