/**************************  VerweisListe.java ********************************/
import AlgoTools.IO;

/** Implementation des Interface Liste mithilfe von Verweisen                 */
    
public class VerweisListe implements Liste {

    private static class ListenEintrag {  // innere Klasse
        Object        inhalt;             // Inhalt des ListenEintrags
        ListenEintrag next;               // Verweis auf naechsten ListenEintrag
    }

    private ListenEintrag anf;            // zeigt auf nullten ListenEintrag
    private ListenEintrag pos;            // zeigt vor aktuellen Listeneintrag

    public VerweisListe() {                        // kreiert eine leere Liste
        pos = anf = new ListenEintrag();
        anf.next  = null;
    }

    public boolean empty()                         // true, wenn Liste leer
      { return anf.next == null; } 

    public boolean endpos()                        // true, wenn am Ende 
      { return pos.next == null; }

    public void reset() {  pos = anf; }            // rueckt an Anfang
    
    public void advance() {                        // rueckt in Liste vor
        if (endpos()) throw new 
          RuntimeException("in VerweisListe.advance");
        pos = pos.next;
    }

    public Object elem() {                         // liefert aktuelles Element
        if (endpos()) throw new 
          RuntimeException("in VerweisListe.elem");
        return pos.next.inhalt;
    }

    public void insert(Object x) {                 // fuegt ListenEintrag ein
        ListenEintrag hilf = new ListenEintrag();  // Das neue Listenelement
        hilf.inhalt        = x;                    // kommt vor das aktuelle
        hilf.next          = pos.next;
        pos.next           = hilf;
    }

    public void delete() {                         // entfernt aktuelles Element
        if (endpos()) throw new 
          RuntimeException("in VerweisListe.delete");
        pos.next = pos.next.next;
    }
}
