/**
  *
  * Programmieraufgabe P-22 (Umdrehen.java)
  *
  * @author Leonhard Fellermayr
  * @version 1.0
  *
  */

import java.util.ListIterator;

/** Implementierung der Klasse Umdrehen */

public class Umdrehen
{

    /**  movePreviousToEnd (ListIterator) : Verschiebt das Element VOR der aktuellen Cursor-Position
      *  des uebergebenen ListIterator an das Ende der Liste.
      *
      *  Die urspruengliche Cursor-Position des uebergebenen ListIterator wird anschliessend
      *  wiederhergestellt.
      *
      *  @param k Instanz des ListIterators, auf der gearbeitet wird.
      *  @return void
      *
      */

    private static void movePreviousToEnd (ListIterator k)
    {

	/** Ans Ende verschoben werden soll jeweils das Element VOR der aktuellen Cursor-Position */
	Object theValue = k.previous ();

	/** Speichere die aktuelle Cursor-Position */
	int restorePos  = k.nextIndex ();

	/** Entferne das Element an seiner urspruenglichen Position */
	k.remove ();

	/** Springe zum Ende */
	while ( k.hasNext () )
		k.next ();

	/** Fuege Element dort hinzu */
	k.add (theValue);

	/** Setze Cursor an die alte Position zurueck (restore) */
	for (int i = k.nextIndex (); i > restorePos; i--)
		k.previous ();

    } // movePreviousToEnd ()

    /**  reverse (InfoIIListe) : Reversiert die uebergebene Liste.
      *
      *  Die Iteration ueber der Liste erfolgt von hinten nach vorne. Dabei wird beim zweithintersten
      *  Element begonnen. Jedes dieser Elemente wird mittels moveToEnd () ans Ende der Liste
      *  verschoben.
      *  Nach Verschieben des vordersten Listenelements liegt eine reversierte Liste vor.
      *
      *  Alternativ haette man genauso das vorderste Element fix lassen und die anderen Elemente via
      *  Move-Next-To-Beginning behandeln koennen.
      *
      *  @param l Die zu reversierende Liste vom Typ InfoIIListe
      *  @return void
      *
      */

    public static void reverse (InfoIIListe l)
    {

	/** Stellt einen ListIterator zur Liste l zur Verfuegung (Cursor-Position am Anfang) */
	ListIterator k = l.listIterator ();

	/** Setze Cursor VOR das hinterste Element */
	while ( k.hasNext () )
		k.next ();		/** ganz hinten  */
	k.previous ();			/** eins zurueck */

	/** Bewege nun jedes der (n-1) Elemente davor ans Ende der Liste */
	while (k.hasPrevious ())
		movePreviousToEnd (k);

    } // reverse ()

} // Klasse Umdrehen
