public class ListaLigadaSimple {
   private int elContador; //almacena cuantos elementos hay en la lista
   private ListaLigadaSimpleNodo head;//referencia al inicio de la lista
   public ListaLigadaSimple() { this.elContador=0; this.head=null;}
   /**
     * Retorna cuantos datos almacena la lista ligada
    */
   public int cuantos() { return this.elContador;}
   /**
     * Verifica si la lista está vacia
     * @return true si esta vacia, false si esta llena
     */
   public boolean isVacia() { return cuantos()==0;}
   /**
     * Agrega un dato al principio de la lista
     */
   public void agregarAInicio(Object elDato) {
      this.head = new ListaLigadaSimpleNodo(elDato,head);
      this.elContador++;
   }
   /**
     * Borrar al dato del principio de la lista
     * @return el dato removido
     */
   public Object removerDeInicio() {
      ListaLigadaSimpleNodo temporal = head;
      head = head.getSiguiente(); this.elContador --;
      return temporal.getDato();
   }
   /**
     * Obtiene el dato que esta al inicio de la clase
     * @return el dato o null si la lista esta vacia
   public Object getInicio() { return head.getDato();}
   /**
     * Agrega un dato al final de la lista
     */
   public void agregarAFinal(Object elDato) {
      ListaLigadaSimpleNodo temp =  new ListaLigadaSimpleNodo(elDato);
      if ( head != null ) {
         ListaLigadaSimpleNodo actual = head;
         while ( actual.getSiguiente() != null) { //hay uno mas? 
             actual = actual.getSiguiente();
         }//while
         actual.setSiguiente(temp);
      } else { head = temp;}
      this.elContador++;
   }
   /**
     * Remover a un dato del final de la lista, invocar si y solo si la lista no esta vacia
     * @return el dato removido
     */
   public Object removerDeFinal() {
      ListaLigadaSimpleNodo actual = this.head, previo=null;
      while (actual.getSiguiente()!=null) { //hay uno mas?
         previo = actual; actual=actual.getSiguiente();
      }
      if (previo==null) {  head=null; //solo existe un elemento 
      } else { previo.setSiguiente(null); } //se olvida del ultimo elemento
      this.elContador--;
      return actual.getDato();
   }
   /**
     * Verifica si la lista ligada contiene o almacena al dato proporcionado
     * @return true si esta en la lista, false si no lo encontro
     */
   public boolean contiene(Object elDato) {
       ListaLigadaSimpleNodo actual = head;
       while (actual !=null && !actual.getDato().equals(elDato) ) {
          actual = actual.getSiguiente();
       }
       return actual!=null; //lo encontro por que no llego al final de la lista?
   }
   /**
     * Remueve al dato indicado, del primer nodo de la lista que lo encuentre
     * @return el dato, si lo encontro o null si no existe en la lista
     */
   public Object remover(Object elDato) {
      ListaLigadaSimpleNodo actual = head, previo=null;
      while (actual!=null && !actual.getDato().equals(elDato) ) {//hasta el final
        previo=actual; actual=actual.getSiguiente();
      }
      if (actual!=null) { //se encontro el elemento a remover
        if (previo==null) { head = actual.getSiguiente(); 
        } else { previo.setSiguiente(actual.getSiguiente()); }
        this.elContador--;
        return actual.getDato();        
      }
      return null;
   }
}














