Riešenia (skupina A, 3. týždeň)

Praktické cvičenie

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;

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

        private Uzol vratITy(int index) {
                int pocitadlo = 0;
                Uzol aktualny = prvy;
                while (aktualny != null) {
                        if (pocitadlo == index) {
                                return aktualny;
                        }

                        aktualny = aktualny.dalsi;
                        pocitadlo++;
                }

                return null;
        }

        public int get(int index) {
                Uzol uzolSObsahom = vratITy(index);
                if (uzolSObsahom != null)
                        return uzolSObsahom.hodnota;
                else
                        throw new IndexOutOfBoundsException();
        }

        public void add(int value) {
                Uzol novy = new Uzol();
                novy.hodnota = value;
                novy.dalsi = null;

                if (prvy == null) {
                        prvy = novy;
                        return;
                }

                Uzol aktualny = prvy;
                while (aktualny.dalsi != null) {
                        aktualny = aktualny.dalsi;
                }

                aktualny.dalsi = novy;
        }

        public void add(int index, int value) {
                Uzol novy = new Uzol();
                novy.hodnota = value;

                if (index == 0) {
                        novy.dalsi = prvy;
                        prvy = novy;
                        return;
                }

                Uzol predosly = vratITy(index - 1);
                novy.dalsi = predosly.dalsi;
                predosly.dalsi = novy;
        }

        public int size() {
                int pocet = 0;
                Uzol aktualny = prvy;
                while (aktualny != null) {
                        aktualny = aktualny.dalsi;
                        pocet++;
                }

                return pocet;
        }

        public void remove() {
                int dlzka = size();
                if (dlzka == 1) {
                        prvy = null;
                } else {
                        Uzol predposledny = vratITy(dlzka - 2);
                        predposledny.dalsi = null;
                }
        }

        public void set(int index, int value) {
                Uzol uzolSObsahom = vratITy(index);
                if (uzolSObsahom != null)
                        uzolSObsahom.hodnota = value;
                else
                        throw new IndexOutOfBoundsException();
        }

        public static void main(String[] args) {
                SpajanyZoznam zoznam = new SpajanyZoznam();
                /**
                 * for (int i = 0; i < 10; i++) zoznam.pridajNaZaciatok((int)
                 * (Math.random() * 100));
                 **/


                System.out.println(zoznam);
                zoznam.add(333);
                System.out.println(zoznam);
        }
}