import java.util.ListIterator;
import java.util.NoSuchElementException;

public class LinkedList implements InfoIIListe {

    Link first;
    Link last;

    private void leeren() {
	first = null;
	last = null;
    }

    public LinkedList() {
	leeren();
    }

    public ListIterator listIterator() {
	return new LinkedListIterator(this);
    }

    public Object getFirst() {
	if (first==null) throw new NoSuchElementException();
	else return first.data;
    }

    public Object getLast() {
	if (last==null) throw new NoSuchElementException();
	else return last.data;
    }

    public void addFirst(Object obj) {
	Link newLink = new Link();
	newLink.data = obj;
	newLink.next = first;
	newLink.prev = null;
	if (first == null) {
	    first = newLink;
	    last = newLink;
	} else {
	    first.prev = newLink;
	    first = newLink;
	}
    }

    public void addLast(Object obj) {
	// keine Implementierung
    }

    public Object removeFirst() {
	return null; // keine Implementierung
    }

    public Object removeLast() {
	return null; // keine Implementierung
    }
}

 
class Link {

    public Object data;
    public Link next;
    public Link prev;
}


class LinkedListIterator implements ListIterator {
    private Link forward;
    private Link backward;
    private LinkedList list;
    private Link lastReturned;

    public LinkedListIterator(LinkedList l) {
	forward = l.first;
	backward = null;
	list = l;
	lastReturned = null;
    }
    
    public void add(Object obj) {
	lastReturned = null;
	if (backward == null) {
	    list.addFirst(obj);
	    backward = list.first;
	} else if (!hasNext()) {
	    list.addLast(obj);
	    backward = backward.next;
	} else {
	    Link newLink = new Link();
	    newLink.data = obj;
	    newLink.next = forward;
	    newLink.prev = backward;
	    backward.next = newLink;
	    forward.prev = newLink;
	    backward = newLink;
	}
    }
    
    public boolean hasNext() {
	return forward != null;
    }
    
    public boolean hasPrevious() {
	return backward!= null;
    }
    
    public Object next() {
	lastReturned = forward;
	backward = forward;
	forward = forward.next;
	return backward.data;
    }
    
    public int nextIndex() {
	return 0;  // keine Implementierung
    }

    public Object previous() {
	return null; // keine Implementierung
    }
    
    public int previousIndex() {
	return 0;  // keine Implementierung
    }

    public void remove() {
	// keine Implementierung
    }

    public void set(Object obj) {
	// keine Implementierung
    }
}


	
