Salve a tutti! Mi sono appena iscritto a questo bel forum, spero possiate aiutarmi col mio problema Allora, sono uno studente di ingegneria informatica e mi è stato assegnato un progetto dal mio prof. di programmazione da presentare entro la fine del corso: partendo da un interfaccia "Lista", fare una classe astratta "ListaAstratta" che estende l'interfaccia e poi fare un erede della classe astratta, chiamata "ListaConcatenata". Cercando qui, ho trovato un'altra discussione (http://forum.html.it/forum/showthread/t-1407146.html) che espone il mio stesso problema, ma non essendoci risposte, non ne ho tratto niente e quindi volevo riprendere la questione.
Io praticamente ho problemi con il listIterator (la remove non so come implementarla e previous si comporta in modo strano, non so se è c'è qualcosa con la add) e non so come implementare il metodo sort...

Questa è la traccia del progetto:

codice:
import java.util.*;

public interface Lista<T extends Comparable<? super T>> extends Iterable<T> {
	
	int size ();
	void clear ();
	void addFirst (T x);
	void addLast (T x);
	T getFirst ();
	T getLast ();
	T removeFirst ();
	T removeLast ();
	boolean isEmpty ();
	boolean isFull ();
	void sort (Comparator<T> c);
	ListIterator<T> listIterator ();
	ListIterator<T> listIterator (int start);
	
} // Lista.
Ecco la classe astratta:

codice:
import java.util.*;

public abstract class ListaAstratta<T extends Comparable<? super T>> implements Lista<T> {
	
	public int size () {
		int c = 0;
		for (@SuppressWarnings("unused") T x : this)
			c++;
		return c;
	} // size
	
	public void clear () {
		for (Iterator<T> it = this.iterator(); it.hasNext(); ) {
			it.next();
			it.remove();
		}		
	} // clear
	
	public void addLast (T x) {
		ListIterator<T> lit = this.listIterator();
		while (lit.hasNext())
			lit.next();
		lit.add(x);
	} // addLast
	
	public T getLast () {
		ListIterator<T> lit = this.listIterator();
		while (lit.hasNext())
			lit.next();
		return lit.previous();
	} // getLast
	
	public T removeLast () {
		ListIterator<T> lit = this.listIterator();
		while (lit.hasNext())
			lit.next();
		T x = lit.previous();
		lit.remove();
		return x;
	} // removeLast
	
	public boolean isEmpty () {
		return !iterator().hasNext();
	} // isEmpty
	
	public boolean isFull () {
		return false;
	} // isFull
	
	public boolean contains (T x) {
		for (T e : this) {
			if (e.equals(x)) return true;
			if (e.compareTo(x) > 0) return false;
		}
		return false;
	} // contains
	
	@Override
	public String toString () {
		StringBuffer sb = new StringBuffer(100);
		sb.append ('[');
		Iterator<T> it = this.iterator();
		while (it.hasNext()) {
			sb.append (it.next());
			if (it.hasNext()) sb.append(", ");
		}
		sb.append(']');
		return sb.toString();
	} // toString
	
	@Override
	@SuppressWarnings("unchecked")
	public boolean equals (Object o) {
		if (!(o instanceof Lista)) return false;
		if (o == this) return true;
		Lista<T> s = (Lista<T>)o;
		if (s.size() != this.size()) return false;
		Iterator<T> it1 = this.iterator();
		Iterator<T> it2 = s.iterator();
		while (it1.hasNext()) {
			T e1 = it1.next();
			T e2 = it2.next();
			if (!e1.equals(e2)) return false;
		}
		return true;
	} // equals
	
	@Override
	public int hashCode () {
		final int MOLT = 43; 
		int h = 0;
		for (T e: this)
			h = h * MOLT + e.hashCode();
		return h;	
	} // hashCode
	
} // ListaAstratta.
Qui non ho avuto molti problemi, un pò dubbioso su lastRemove che non ho avuto modo di provare per il fatto della remove sulla classe concreta. Ecco infine la classe concreta:


codice:
import java.util.*;

public class ListaConcatenata<T extends Comparable<? super T>> extends ListaAstratta<T> {

	private static class Nodo<E> {
		E info;
		Nodo<E> next;
		Nodo<E> prev;
	} // Nodo
	
	private Nodo<T> head;
	private Nodo<T> tail;
	
	public ListaConcatenata () {
		head = null;
		tail = null;
	} // Costruttore
	
	public void addFirst (T x) {
		Nodo<T> nuovoNodo = new Nodo<T>();
		nuovoNodo.info = x;
		if (isEmpty())
			tail = nuovoNodo;
		else {
			head.prev = nuovoNodo;
			nuovoNodo.next = head;
		}
		head = nuovoNodo;
	} // addFirst
	
	public void addLast (T x) {
		Nodo<T> nuovoNodo = new Nodo<T>();
		nuovoNodo.info = x;
		if (isEmpty())
			head = nuovoNodo;
		else {
			tail.next = nuovoNodo;
			nuovoNodo.prev = tail;
		}
		tail = nuovoNodo;
	} // addLast
	
	public T getFirst () {
		if (head == null)
			throw new NoSuchElementException("Lista vuota!");
		return head.info;
	} // getFirst
	
	public T getLast () {
		if (tail == null)
			throw new NoSuchElementException("Lista vuota!");
		return tail.info;
	} // getLast
	
	public T removeFirst () {
		if (head == null)
			throw new NoSuchElementException("Lista vuota!");
		T x = head.info;
		if (head.next == null)
			tail = null;
		else
			head.next.prev = null;
		head = head.next;
		return x;	
	} // removeFirst
	
	public T removeLast () {
		if (tail == null)
			throw new NoSuchElementException("Lista vuota!");
		T x = tail.info;
		if (tail.prev == null)
			head = null;
		else
			tail.prev.next = null;
		tail = tail.prev;
		return x;
	} // removeLast
	
	public void sort (Comparator<T> c) {
	} // sort
	
	public Iterator<T> iterator () {
		return new Iteratore();
	} // iterator
	
	public ListIterator<T> listIterator () {
		return new IteratoreDiLista();
	} // listIterator
	
	public ListIterator<T> listIterator (int start) {
		return new IteratoreDiLista(start);
	} // listIterator
	
	// --------------
	// Inner Classes.
	// --------------
	
	private class Iteratore implements Iterator<T> {
		
		private Nodo<T> current;
		private Nodo<T> precedent;
		
		public Iteratore () {
			current = null;
			precedent = null;
		} // Costruttore
		
		public boolean hasNext () {
			if (current == null)
				return head != null;
			else
				return current.next != null;		
		} // hasNext
		
		public T next () {
			if (!hasNext())
				throw new NoSuchElementException();
			precedent = current; 
			if (current == null)
				current = head;
			else
				current = current.next;
			return current.info;
		} // next
		
		public void remove () {
			if (precedent == current)
				throw new IllegalStateException();
			if (current == head) 
				removeFirst();
			else if (current == tail)
				removeLast();
			else 
				precedent.next = current.next;
			current = precedent;	
		} // remove
		
	} // Iteratore.
	
	public class IteratoreDiLista implements ListIterator<T>  {
		
		private Nodo<T> current;
		private Nodo<T> precedent;
		private Nodo<T> successive;
		
		public IteratoreDiLista () {
			current = null;
			precedent = null;
			successive = null;
		} // 1° Costruttore
		
		public IteratoreDiLista (int start) {
			if (start > size())
				throw new IllegalArgumentException();
			int c = 0;
			while (hasNext() && c < start) {
				current = current.next;
				c++;
			}
			precedent = null;
			successive = null;
		} // 2° Costruttore (con indice di partenza)
		
		public boolean hasNext () {
			if (current == null)
				return head != null;
			else
				return current.next != null;		
		} // hasNext.
		
		public T next () {
			if (!hasNext())
				throw new NoSuchElementException();
			precedent = current; 
			if (current == null)
				current = head;
			else
				current = current.next;
			return current.info;
		} // next
		
		public boolean hasPrevious () {
			return current.prev != null;
		} // hasPrevious
		
		public T previous () {
			if (!hasPrevious())
				throw new NoSuchElementException();
			successive = current; 
			current = current.prev;
			return current.info;
		} // previous
		
		public void add (T x) {
			if (current == null) {
				addFirst(x);
				current = head;
			} else {
				Nodo<T> nuovoNodo = new Nodo<T>();
				nuovoNodo.info = x;
				nuovoNodo.next = current.next;
				current.next = nuovoNodo;
				nuovoNodo.prev = current;
			}
		} // add
		
		public void remove () {
			if (precedent == current || successive == current)
				throw new IllegalStateException()
			if (current == head) 
				removeFirst();
			else if (current == tail)
				removeLast ();
                        // Qui mi sono bloccato.
		} // remove
		
		public void set (T x) {
			if (current == null)
				throw new NoSuchElementException();
			current.info = x;
		} // set
		
                // Il prof. ha detto di non implementare i metodi di listIterator
                // che abbiano a che fare con gli indici.

		public int nextIndex () {
			throw new UnsupportedOperationException ();
		} // nextIndex
		
		public int previousIndex () {
			throw new UnsupportedOperationException ();
		} // previousIndex
		
	} // IteratoreDiLista

} // ListaConcatenata
Poi ho fatto un main di prova e questi sono i risultati:

codice:
Creazione di una lista...
/////////////////////////
Aggiunta dell' elemento 1 in testa della lista.
Aggiunta dell' elemento 2 in coda della lista.
Aggiunta dell' elemento 3 in testa della lista.
Aggiunta dell' elemento 4 in coda della lista.
Aggiunta dell' elemento 5 in testa della lista.
Aggiunta dell' elemento 6 in coda della lista.
Lista creata: [5, 3, 1, 2, 4, 6] size: 6
Elemento rimosso in testa: 5
Lista corrente: [3, 1, 2, 4, 6] size: 5
Elemento rimosso in coda: 6
Lista corrente: [3, 1, 2, 4] size: 4
Elemento corrente in testa: 3
Elemento corrente in coda: 4 // OK

Creazione dell'iterator... 
///////////////////////////
Lista corrente: [3, 1, 2, 4] size: 4
Verifica sul successivo: true
Elemento successivo: 3
Verifica sul successivo: true
Elemento successivo: 1
Rimozione elemento corrente.
Lista corrente: [3, 2, 4] size: 3
Verifica sul successivo: true
Elemento successivo: 2
Rimozione elemento corrente.
Lista corrente: [3, 4] size: 2 //OK

Creazione del listIterator...
/////////////////////////////
Lista corrente: [3, 4] size: 2
Verifica sul successivo: true
Elemento successivo: 3
Verifica sul successivo: true
Elemento successivo: 4
Aggiunta dell'elemento 7 in lista.
Lista corrente: [3, 4, 7] size: 3
Aggiunta dell'elemento 8 in lista.
Lista corrente: [3, 4, 8, 7] size: 4
Aggiunta dell'elemento 9 in lista.
Lista corrente: [3, 4, 9, 8, 7] size: 5
Aggiunta dell'elemento 10 in lista.
Lista corrente: [3, 4, 10, 9, 8, 7] size: 6
Verifica sul successivo: true
Elemento successivo: 10
Verifica sul successivo: true
Elemento successivo: 9
Verifica sul successivo: true
Elemento successivo: 8

// Qui si presentano i problemi...

Verifica sul precedente: true
Elemento precedente: 4
Verifica sul precedente: true
Elemento precedente: 2
Verifica sul precedente: true
Elemento precedente: 1
Verifica sul precedente: true
Elemento precedente: 3
Cioè, col previous mi itera la lista in maniera giusta, ma itera la lista allo stato prima che creassi il listIterator, non capisco... chiedo consigli, ringrazio anticipatamente chi mi aiuterà