A3

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

}
package paz1b.task3;

import sk.upjs.jpaz2.*;

public class Launcher {

        public static void main(String[] args) {

                SpajanyZoznam sp = new SpajanyZoznam();

                sp.pridajNaZaciatok(4);
                sp.pridajNaZaciatok(15);
                sp.pridajNaZaciatok(63);
                sp.pridajNaZaciatok(89);
                sp.pridajNaZaciatok(20);


                System.out.println(sp);
                System.out.println(sp.vratITy(8));

                /*sp.add(14);

                System.out.println(sp);

                sp.add(2,99);

                System.out.println(sp);

                sp.remove(0);

                System.out.println(sp);
                sp.remove(4);

                System.out.println(sp);
                sp.remove(7);
                System.out.println(sp.getPocetPrvkov());*/

        }
}