B3

package sk.upjs.paz.cvicenie03;

/**
 * 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;

        @Override
        public String toString() {
            if (dalsi == null) {
                return hodnota + "(next: NULL)";
            }
            return hodnota + "(next: " + dalsi.hodnota + ")";
        }
    }

    /**
     * Referencia na prvy uzol spajaneho zoznamu
     */

    private Uzol prvy = null;

    /**
     * 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;
    }

    @Override
    public String toString() {
        String vysledok = "[";
        Uzol aktualny = prvy;
        while (aktualny != null) {
            if (aktualny != prvy)
                vysledok += ", ";

            vysledok += aktualny;
            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;
    }

    public void add(int value) {
        Uzol novy = new Uzol();
        novy.hodnota = value;
        if (prvy == null) {
            prvy = novy;
        } else {
            Uzol aktualny = prvy;
            //while (aktualny != null) {
            while (true) {
                if (aktualny.dalsi == null) {
                    aktualny.dalsi = novy;
                    return;
                }
                aktualny = aktualny.dalsi;

            }
        }
    }

    // este vyriesit index mimo rozsahu
    public void remove(int index) {
        if (prvy == null) {
            return;
        }
        if (index == 0) {
            prvy = prvy.dalsi;
            return;
        }
        // presun index-1 krat
        Uzol aktualny = prvy;
        for (int i = 0; i < index - 1; i++) {
            // aktualny chcem aby predchadzal uzlu ktory odstranujem
            aktualny = aktualny.dalsi;
            if (aktualny.dalsi == null) {
                return;
            }

        }
        aktualny.dalsi = aktualny.dalsi.dalsi;
    }

    public static void main(String[] args) {
        SpajanyZoznam z = new SpajanyZoznam();
        z.add(7);
        z.add(2);
        z.add(6);
        z.add(4);

        z.remove(4);
        // chcem 7,2,4
        System.out.println(z);

    }
}