/** Liste, die aus Listenelementen besteht */
class Liste{
	
	/** Kopf der Liste, das erste Listenelement von "vorne" */
	ListenElement kopf;

	/** Konstruktor, der nichts tut */
	public Liste() {}
	
	/**
	 * Konstruktor, der den Kopf der Liste gleich setzt
	 * @param kopf
	 */
	public Liste(ListenElement kopf) {
		this.kopf = kopf;
	}

	/**
	 * Gibt das letzte Listenelement der Liste zurueck. Das ist definitionsgemaess das Element,
	 * dessen Nachfolger <code>null</code> ist. Falls die Liste leer ist, also kein einziges 
	 * Listenelement ungleich <code>null</code> enthaelt, wird <code>null</code> zurueckgegeben.
	 * @return ListenElement, das letzte Element der Liste
	 */
	public ListenElement getEnde() {
		if (kopf == null) return null;
		ListenElement dieses_element = kopf;
		while(dieses_element.nachfolger != null)
			dieses_element = dieses_element.nachfolger;
		return dieses_element;
	}

	/**
	 * Fuegt am Ende der Liste das uebergebene Listenelement hinzu. Wenn die Liste leer ist, wird 
	 * dieses Element der Kopf der Liste. Der Nachfolger des hinzugefuegten Elementes wird nicht 
	 * geaendert.  
	 * @param nachfolger, ListenElement, das eingefuegt werden soll
	 */
	public void fuegehinzu(ListenElement nachfolger) {
		if (kopf == null)
			kopf = nachfolger;
		else
			getEnde().nachfolger = nachfolger;
	}

	/**
	 * Gibt die ganze Liste, d.h. alle Inhalte der Listenelemente, in einer Zeile auf der Konsole 
	 * aus.
	 */
	public void ausgabe() {
		ListenElement dieses_element = kopf;
		while(dieses_element != null) {
			System.out.print(dieses_element.inhalt+" ");
			dieses_element = dieses_element.nachfolger;
		}
		System.out.println(); // Zeilenumbruch
	}

	/**
	 * Bestimmt die Anzahl der Listenelemente in der Liste, also 0, wenn die Liste leer ist, 1, wenn 
	 * der Kopf keinen Nachfolger ungleich <code>null</code> hat, usw. 
	 * @return int, Anzahl der Listenelement in der Liste
	 */
	public int anzahl() {
		int zaehler = 0;
		ListenElement dieses_element = kopf;
		while(dieses_element != null) {
			zaehler = zaehler + 1;
			dieses_element = dieses_element.nachfolger;
		}
		return zaehler;
	}

	/**
	 * Gibt zurueck, ob ein uebergebener Wert als Inhalt eines Listenelements in der Liste vorhanden ist.
	 * @param wert int, fuer den das ueberprueft werden soll
	 * @return boolean, true wenn ja, sonst false
	 */
	public boolean istEnthalten(int wert) {
		ListenElement dieses_element = kopf;
		while(dieses_element != null) {
			if (dieses_element.inhalt == wert) return true;
			dieses_element = dieses_element.nachfolger;
		}
		return false;
	}

	/**
	 * Gibt das erste ListenElement der Liste zurueck, das einen uebergebenen Wert als Inhalt hat. Gibt es 
	 * kein solches Element in der Liste, wird <code>null</code> zurueckgegeben. 
	 * @param wert int, dessen Listenelement gesucht wird
	 * @return ListenElement, das diesen Wert besitzt, oder <code>null</code>
	 */
	public ListenElement suche(int wert) {
		ListenElement dieses_element = kopf;
		while(dieses_element != null) {
			if (dieses_element.inhalt == wert) return dieses_element;
			dieses_element = dieses_element.nachfolger;
		}
		return null;
	}

	/**
	 * Loescht alle Element aus der Liste, die den uebergebenen Wert haben.
	 * @param wert int, dessen Elemente zu loeschen sind
	 */
	public void loesche(int wert) {
		if (kopf == null) return;
		if (kopf.inhalt == wert) kopf = kopf.nachfolger;
		ListenElement dieses_element = kopf;
		while(dieses_element.nachfolger != null) {
			if (dieses_element.nachfolger.inhalt == wert)
				dieses_element.nachfolger = dieses_element.nachfolger.nachfolger;
			dieses_element = dieses_element.nachfolger;
		}		
	}

}
