package es.ubu.inf.edat.pr06; import java.util.AbstractList; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.ListIterator; public class ListaEnlazada extends AbstractList { private List lista; private int contador; private Nodo ultimo; private Nodo primero; public ListaEnlazada() { primero = null; ultimo = null; lista = new LinkedList(); contador = 0; //Variable para saber cuantas elementos hay en la lista. } @Override public E get(int arg0) { return lista.get(arg0); } @Override public int size() { return contador; } public boolean add(E objeto) { Nodo nuevo = new Nodo(objeto); if (lista.size() == 0) { primero = nuevo; ultimo = nuevo; } else { ultimo.setSiguiente(nuevo); nuevo.setSiguiente(null); ultimo = nuevo; } contador++; System.out.println(contador); return true; } public void add(int i, E e) { throw new UnsupportedOperationException(); } public E remove(int posicion) { E aux = ultimo.getDato(); Nodo aux2 = null; if (lista.size() == 0) { throw new UnsupportedOperationException("Lista vacia"); } else if (primero == ultimo) { primero = null; ultimo = null; if (posicion < 0 || posicion >= size()) throw new IndexOutOfBoundsException(); } else { aux2 = primero; for (int i = 0; i < posicion; i++) { aux2 = aux2.getSiguiente(); if (i == posicion - 1) { aux2.setSiguiente(primero); ultimo = aux2; } } } contador--; return aux; } public void clear() { primero = null; ultimo = null; } private class Nodo { private E dato; private Nodo siguiente; public Nodo(E dato) { this.dato = dato; } public E getDato() { return dato; } public void setDato(E objeto) { this.dato = objeto; } public Nodo getSiguiente() { return siguiente; } public void setSiguiente(Nodo siguiente) { this.siguiente = siguiente; } } @Override public Iterator iterator() { return new ListIterator() { private int contador2 = 0; //Variable para saber la posicion actual. private E aux = null; private Nodo actual = primero; @Override public boolean hasNext() { if (actual == null) return false; else return true; } @Override public E next() { if (contador == 0) { throw new UnsupportedOperationException("Lista vacia"); } else if (primero == ultimo) { aux = lista.get(0); } else { if (actual!=null) { aux = actual.getDato(); actual.getSiguiente(); } } contador2++; return aux; } @Override public boolean hasPrevious() { if (actual == primero) return false; else return true; } @Override public int nextIndex() { return contador2; } @Override public E previous() { Nodo anterior = primero; if (lista.size() == 0) { throw new UnsupportedOperationException("Lista vacia"); } else if (primero == ultimo) { aux = lista.get(0); } else { if (contador < lista.size()) { aux = actual.getDato(); while (anterior != actual) { anterior.getSiguiente(); } actual.setSiguiente(anterior); } } contador2--; return aux; } @Override public int previousIndex() { return contador2; } // Métodos NO utilizados @Override public void set(E arg0) { throw new UnsupportedOperationException(); } @Override public void remove() { throw new UnsupportedOperationException(); } @Override public void add(E arg0) { throw new UnsupportedOperationException(); } }; } }