C3

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

        /**
         * 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) {
                Uzol aktualny = prvy;
                int poradie = 0;
                while (aktualny != null) {
                        if (poradie == index)
                                return aktualny;

                        poradie++;
                        aktualny = aktualny.dalsi;
                }
            return null;
        }

        public int get(int index) {
                Uzol u = vratITy(index);
                return u.hodnota;
        }

        public void set(int index, int value) {
                Uzol u = vratITy(index);
                u.hodnota = value;
        }

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

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

        public void add(int index, int value) {
                if (index == 0) {
                        pridajNaZaciatok(value);
                        return;
                }

                Uzol u = vratITy(index - 1);
                if (u == null)
                        throw new ArrayIndexOutOfBoundsException();
                Uzol novy = new Uzol();
                novy.hodnota = value;
                novy.dalsi = u.dalsi;
                u.dalsi = novy;
        }

        public void remove(int index) {
                if (index == 0) {
                        prvy = prvy.dalsi;
                        return;
                }

                Uzol u = vratITy(index - 1);
                if (u == null)
                        throw new ArrayIndexOutOfBoundsException();
                u.dalsi = u.dalsi.dalsi;
        }
}

public class Spustac {

        /**
         * @param args
         */

        public static void main(String[] args) {
                SpajanyZoznam z = new SpajanyZoznam();
                z.pridajNaZaciatok(2);
                z.pridajNaZaciatok(3);
                z.pridajNaZaciatok(7);
                z.pridajNaZaciatok(1);
                z.pridajNaZaciatok(8);
                z.pridajNaZaciatok(6);

                System.out.println(z.sucet());
                System.out.println(z.get(2));

                System.out.println(z);
                z.add(25);
                System.out.println(z);
                z.remove(3);
                System.out.println(z);
        }

}

Teoretické cvičenie

/**
 * 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 int pocet=0;
        private Uzol posledny = null;
        /**
         * Prida novu hodnotu na zaciatok spajaneho zoznamu
         * @param hodnota pridavana hodnota
         */

        public void pridajNaZaciatok(int hodnota) {

                Uzol pridavany = new Uzol();
                if(prvy==null){posledny=pridavany;}
                pridavany.hodnota = hodnota;
                pridavany.dalsi = prvy;
                prvy = pridavany;
                pocet++;
        }

        @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) {
                Uzol aktualny = prvy;
                int poradie = 0;
                while (aktualny != null) {
                        if (poradie == index)
                                return aktualny;

                        poradie++;
                        aktualny = aktualny.dalsi;
                }
            return null;
        }

        public int get(int index) {
                Uzol u = vratITy(index);
                return u.hodnota;
        }

        public void set(int index, int value) {
                Uzol u = vratITy(index);
                u.hodnota = value;
        }

        public void add(int value) {
                Uzol novy = new Uzol();

                novy.hodnota = value;  

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

                }

                posledny.dalsi=novy;
                posledny=novy;
                pocet++;
        }

        public void add(int index, int value) {
                if (index == 0) {
                        pridajNaZaciatok(value);
                        return;
                }


                Uzol u = vratITy(index - 1);
                if (u == null)
                        throw new ArrayIndexOutOfBoundsException();
                Uzol novy = new Uzol();
                if(pocet==index){posledny=novy;}
                novy.hodnota = value;
                novy.dalsi = u.dalsi;
                u.dalsi = novy;
                pocet++;
        }

        public void remove(int index) {
                if (index == 0) {
                        prvy = prvy.dalsi;
                        return;
                }

                Uzol u = vratITy(index - 1);
                if(index==pocet-1){posledny=vratITy(index - 1);}
                if (u == null)
                        throw new ArrayIndexOutOfBoundsException();
                u.dalsi = u.dalsi.dalsi;
                pocet--;
        }
}