/** * Lista ligada usando un nodo centinela al inicio y otro al final de la misma * @author Amparo López Gaona * @version 1a. ed. abril 2011 */ public class Lista implements Listable{ private Nodo inicio; private Nodo fin; /** * Metodo para construir una lista vacia */ public Lista() { inicio = null; fin = null; } /** * Metodo para probar que la lista este vacia. * @return boolean -- true si esta vacia y false en otro caso. */ public boolean estaVacia() { return inicio == null && fin == null; } /** * Metodo para dejar vacia una lista */ public void vaciar() { inicio = fin = null; } /** * Metodo para devolver el primer elemento de la lista * @return Object -- primer elemento de la lista */ public Object primerElemento() { return (estaVacia()) ? null : inicio.elemento; } /** * Metodo para devolver el ultimo elemento de la lista * @return Object -- ultimo elemento de la lista **/ public Object ultimoElemento() { return (estaVacia()) ? null : fin.elemento; } /** * Metodo para determinar si un elemento esta contenido en la lista. * @param dato -- elemento a buscar. * @return boolean - true si el dato esta en la lista y false en otro caso. */ public boolean contiene(Object dato) { Nodo pos = inicio; while(pos != null && !dato.equals(pos.elemento)) pos = pos.sgte; return pos != null; } /** * Metodo para sustituir el valor actual de un nodo por otro nuevo. * @param orig -- valor original * @param nuevo -- nuevo valor */ public void sustituir(Object orig, Object nuevo) { Nodo pos = inicio; while(pos != null && !orig.equals(pos.elemento)) { pos = pos.sgte; } if (pos != null) pos.elemento = nuevo; } /** * Metodo para insertar el primer elemento de la lista. * @param dato -- el dato a agregar. */ public void agregarAlInicio(Object dato) { if (estaVacia()) inicio = fin = new Nodo(dato); else inicio = new Nodo(dato,inicio); } /** * Metodo para insertar el ultimo elemento de la lista. * @param dato -- el dato a agregar. */ public void agregar(Object dato) { if (estaVacia()) inicio = fin = new Nodo(dato); else fin = fin.sgte = new Nodo(dato); } /** * Metodo para eliminar la primera ocurrencia de un dato. * @param dato -- el dato a eliminar. */ public void eliminar(Object dato) { Nodo pos = inicio, anterior = null; while(pos != null && !dato.equals(pos.elemento)) { anterior = pos; pos = pos.sgte; } if (pos == null) return; // No lo encontro if(pos == inicio) { // Es el inicio de la lista inicio = inicio.sgte; if (inicio == null) fin = null; } else { anterior.sgte = pos.sgte; if (anterior.sgte == null) fin = anterior; } } /** * Metodo para eliminar el primer elemento de una lista */ public void eliminarPrimero() { if (!estaVacia()) { inicio = inicio.sgte; if (inicio == null) fin = null; } } /** * Metodo para crear un iterador sobre la lista */ public java.util.Iterator iterador() { return new MiIterador(); } /* * Clase privada que implementa el iterador */ private class MiIterador implements java.util.Iterator { private Nodo posicion = inicio; public boolean hasNext() { return posicion != null;} public Object next() { if (hasNext()) { Object o = posicion.elemento; posicion = posicion.sgte; return o; } return null; } public void remove() { throw new IllegalStateException(); } } }