/*
  Copyright (c) October 2012 by Paweł Rzechonek
  Program definiuje klasę implementującą interfejs do operacji na zbiorze łańcuchów.
  Istotne elementy w programie:
    * implementacja interfejsu za ponocą listy jednokierunkowej;
    * implementacja klonowania;
    * zastosowanie klasy wewnętrznej do budowy homogenicznej listy zbudowanej z węzłów.
*/

public class Lista implements Zbior
{
    protected class Wezel implements Cloneable
    {
        protected String łańcuch;
        protected Wezel następnik;

        public Wezel (String łań, Wezel nast)
        {
            if (łań==null) throw new NullPointerException();
            łańcuch = łań;
            następnik = nast;
        }
        public Wezel (String łań)
        {
            this(łań,null);
        }

        public Wezel wstaw_na_pocz (String s)
        {
            return new Wezel(s,this);
        }
        public Wezel wstaw_na_kon (String s)
        {
            if (następnik==null) następnik = new Wezel(s);
            else następnik.wstaw_na_kon(s);
            return this;
        }
        public boolean szukaj (String s)
        {
            if (s.equals(łańcuch)) return true;
            if (następnik==null) return false;
            return następnik.szukaj(s);
        }
        public int ile ()
        {
            if (następnik==null) return 1;
            return 1+następnik.ile();
        }

        public Wezel clone ()
        {
            try
            {
                Wezel w = (Wezel)super.clone();
                if (następnik!=null) w.następnik = następnik.clone();
                return w;
            }
            catch (CloneNotSupportedException ex) { return null; }
        }

        public String toString ()
        {
            String s = "\""+łańcuch+"\"";
            if (następnik!=null) return s+", "+następnik;
            return s;
        }
    }

    protected Wezel lista;

    public void wstaw (String s)
    {
        if (s.equals("")) throw new IllegalArgumentException();
        if (lista==null) lista = this.new Wezel(s);
        else lista = lista.wstaw_na_kon(s);
    }
    public boolean szukaj (String s)
    {
        if (s==null) throw new NullPointerException();
        if (lista==null) return false;
        return lista.szukaj(s);
    }
    public void czyść ()
    {
        lista = null;
    }
    public int ile ()
    {
        if (lista==null) return 0;
        return lista.ile();
    }

    public Lista clone ()
    {
        try
        {
            Lista lis = (Lista)super.clone();
            if (lista!=null) lis.lista = lista.clone();
            return lis;
        }
        catch (CloneNotSupportedException ex) { return null; }
    }

    public String toString ()
    {
        if (lista==null) return "()";
        return "("+lista+")";
    }
}
