import java.lang.*; import java.util.NoSuchElementException; import java.util.Vector; public class SLinkedList implements List { private int length = 0; private SLink first = null; private SLink last = null; private static class SLink { Object item; SLink next; SLink( Object o, SLink n ) { item = o; next = n; } SLink( Object o ) { this( o, null ); } } static private boolean objectEquals( Object a, Object b ) { /* * Este método compara dos referencias de objetos y devuelve true si y sólo si * ambas referencias son null o ambas referencias se refieren a objetos que * se comprueban de igual forma utilizando el método Object.equal(). */ if ( a == null ) return ( b == null ); else return a.equals( b ); } public int size() { return length; } public Object removeFirst() throws NoSuchElementException { if ( first == null ) // si la lista está vacía throw new NoSuchElementException(); else { SLink t = first; first = first.next; if ( first == null ) // si la lista tenía 1 elemento y ahora está vacía last = null; length--; return t.item; } } public boolean remove(Object o) { SLink current = first; SLink previous = null; while ( current != null ) { if ( current.item.equals( o ) ) { if ( previous != null ) { // el elemento que se va a eliminar no es el primero previous.next = current.next; if ( previous.next == null ) // de hecho, es el último last = previous; } else { // el elemento que se va a eliminar es el primero de la lista first = current.next; if ( first == null ) // acabamos de eliminar el único elemento last = null; } // hemos encontrado el elemento que hay que eliminar length--; return true; } else { // aún no hemos encontrado el elemento; seguimos avanzando previous = current; current = current.next; } } // si salimos del bucle, el elemento no está en la lista return false; } public void addFirst(Object o) { if ( first == null ) // si la lista está vacía { first = last = new SLink( o ); } else { first = new SLink( o, first ); } length++; } public void addLast(Object o) { if ( first == null ) // si la lista está vacía { first = last = new SLink( o ); } else { last = last.next = new SLink( o ); } length++; } public boolean isEmpty() { return( first == null ); } public boolean contains(Object o) { SLink current = first; while ( current != null ) { if ( current.item.equals( o ) ) { return true; } else { // aún no hemos encontrado el elemento; seguimos avanzando current = current.next; } } // si salimos del bucle, el elemento no está en la lista return false; } public void clear() { first = last = null; length = 0; } // estos métodos sólo se utilizan en la simulación Vector listVector() { Vector lv=new Vector(); SLink current = first; while(current!=null) { lv.addElement(current.item); current = current.next; } return lv; } Integer getFirst() { if(first==null) return null; else return (Integer)first.item; } Integer getLast() { if(last==null) return null; else return (Integer)last.item; } }