JuanMtz

ListaEnlazada.java

Mar 2nd, 2020
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.86 KB | None | 0 0
  1. /**
  2.  * Class ListaEnlazada.java
  3.  * Implementación de lista basada en nodos enlazados que se proporciona en el manual de Java,
  4.  * en el Capítulo 9. Estructuras dinámicas lineales.
  5.  * @author Juan José Martínez Solano  02/03/2020
  6.  */
  7.  
  8. /**
  9.  * Representa la implementación más sencilla y básica de una lista enlazada simple
  10.  * con acceso sólo al principio de la serie de nodos.
  11.  */
  12. public class ListaEnlazada {
  13.     // Atributos
  14.     private Nodo primero;      // Referencia a nodo
  15.     private int numElementos;
  16.  
  17.     /**
  18.      * Constructor que inicializa los atributos al valor por defecto.
  19.      * Lista vacía.
  20.      */
  21.     public ListaEnlazada() {
  22.         primero = null;
  23.         numElementos = 0;
  24.     }
  25.  
  26.     /**
  27.      * Representa la estructura de un nodo para una lista dinámica con enlace simple.
  28.      */
  29.     class Nodo {
  30.         // Atributos
  31.         Object dato;
  32.         Nodo siguiente;
  33.         /**
  34.          * Constructor que inicializa atributos por defecto.
  35.          * @param elem - el elemento de información útil a almacenar.
  36.          */
  37.         public Nodo(Object dato) {
  38.             this.dato = dato;
  39.             siguiente = null;
  40.         }
  41.  
  42.     } // class
  43.  
  44.     /**
  45.      * Añade un elemento al final de la lista.
  46.      * @param elem - el elemento a añadir.
  47.      * Admite que el elemento a añadir sea null.
  48.      */
  49.     public void add(Object dato) {   
  50.         //variables auxiliares
  51.         Nodo nuevo = new Nodo(dato);
  52.         Nodo ultimo = null;
  53.         if (numElementos == 0) {
  54.             // Si la lista está vacía enlaza el nuevo nodo el primero.
  55.             primero = nuevo;
  56.         }
  57.         else {
  58.             // Obtiene el último nodo y enlaza el nuevo.
  59.             ultimo = obtenerNodo(numElementos-1);
  60.             ultimo.siguiente = nuevo;
  61.         }
  62.         numElementos++;               // Actualiza el número de elementos.
  63.     }
  64.  
  65.     /**
  66.      * Obtiene el nodo correspondiente al índice. Recorre secuencialmente la cadena de enlaces.
  67.      * @param indice - posición del nodo a obtener.
  68.      * @return - el nodo que ocupa la posición indicada por el índice.
  69.      */
  70.     private Nodo obtenerNodo(int indice) {
  71.         assert indice >= 0 && indice < numElementos;
  72.         // Recorre la lista hasta llegar al nodo  de posición buscada.
  73.         Nodo actual = primero;
  74.         for (int i = 0; i < indice; i++)
  75.             actual = actual.siguiente;
  76.         return actual;
  77.     }
  78.  
  79.     /**
  80.      * Elimina el elemento indicado por el índice. Ignora índices negativos
  81.      * @param indice - posición del elemento a eliminar
  82.      * @return - el elemento eliminado o null si la lista está vacía.
  83.      * @exception IndexOutOfBoundsException - índice no está entre 0 y numElementos-1
  84.      */
  85.     public Object remove(int indice) {
  86.         // Lanza excepción si el índice no es válido.
  87.         if (indice >= numElementos || indice < 0) {
  88.             throw new IndexOutOfBoundsException("Índice incorrecto: " + indice);
  89.         }      
  90.         if (indice > 0) {      
  91.             return removeIntermedio(indice);
  92.         }      
  93.         if (indice == 0) {
  94.             return removePrimero();
  95.         }      
  96.         return null;
  97.     }
  98.  
  99.     /**
  100.      * Elimina el primer elemento.
  101.      * @return - el elemento eliminado o null si la lista está vacía.
  102.      */
  103.     private Object removePrimero() {
  104.         //variables auxiliares
  105.         Nodo actual = null;
  106.         actual = primero;              // Guarda actual.
  107.         primero = primero.siguiente;       // Elimina elemento del principio.
  108.         numElementos--;
  109.         return actual.dato;
  110.     }
  111.  
  112.     /**
  113.      * Elimina el elemento indicado por el índice.
  114.      * @param indice - posición del elemento a eliminar.
  115.      * @return - el elemento eliminado o null si la lista está vacía.
  116.      */
  117.     private Object removeIntermedio(int indice) {
  118.         assert indice > 0 && indice < numElementos;
  119.         //variables auxiliares
  120.         Nodo actual = null;
  121.         Nodo anterior = null;
  122.         // Busca nodo del elemento anterior correspondiente al índice.
  123.         anterior = obtenerNodo(indice - 1);
  124.         actual = anterior.siguiente;             // Guarda actual.
  125.         anterior.siguiente = actual.siguiente;      // Elimina el elemento.
  126.         numElementos--;
  127.         return actual.dato;
  128.     }
  129.  
  130.     /**
  131.      * Elimina el dato especificado.
  132.      * @param dato – a eliminar.
  133.      * @return - el índice del elemento eliminado o -1 si no existe.
  134.      */
  135.     public int remove(Object dato) {
  136.         // Obtiene el índice del elemento especificado.
  137.         int actual = indexOf(dato);
  138.         if (actual != -1) {
  139.             remove(actual);        // Elimina por índice.
  140.         }
  141.         return actual;
  142.     }
  143.  
  144.     /**
  145.      * Busca el índice que corresponde a un elemento de la lista.
  146.      * @param dato- el objeto elemento a buscar.
  147.      */
  148.     public int indexOf(Object dato) {
  149.         Nodo actual = primero;
  150.         for (int i = 0; actual != null; i++) {
  151.             if ((actual.dato != null && actual.dato.equals(dato))
  152.                     || actual.dato == dato) {
  153.                 return i;
  154.             }
  155.             actual = actual.siguiente;
  156.         }
  157.         return -1;
  158.     }
  159.  
  160.     /**
  161.      * @param indice – obtiene un elemento por su índice.
  162.      * @return elemento contenido en el nodo indicado por el índice.
  163.      * @exception IndexOutOfBoundsException - índice no está entre 0 y numElementos-1.
  164.      */
  165.     public Object get(int indice) {
  166.         // lanza excepción si el índice no es válido
  167.         if (indice >= numElementos || indice < 0) {
  168.             throw new IndexOutOfBoundsException("índice incorrecto: " + indice);
  169.         }
  170.         Nodo aux = obtenerNodo(indice);
  171.         return aux.dato;
  172.     }
  173.  
  174.     /**
  175.      * @return el número de elementos de la lista
  176.      */
  177.     public int size() {
  178.         return numElementos;
  179.     }
  180.  
  181.     public static class PruebaListaEnlazada {
  182.         public static void main(String[] args) {
  183.             ListaEnlazada listaCompra = new ListaEnlazada();
  184.             listaCompra.add("Leche");
  185.             listaCompra.add("Miel");
  186.             listaCompra.add("Aceitunas");
  187.             listaCompra.add("Cerveza");
  188.             listaCompra.add("Café");
  189.             System.out.println("Lista de la compra:");
  190.             for (int i = 0; i < listaCompra.size(); i++) {
  191.                 System.out.println(listaCompra.get(i));
  192.             }
  193.             System.out.println("elementos en la lista: " + listaCompra.size());
  194.             System.out.println("elementos 3 en la lista: " + listaCompra.get(3));
  195.             System.out.println("posición del elemento Miel: " + listaCompra.indexOf("Miel"));
  196.             System.out.println("eliminado: " + listaCompra.remove("Miel"));
  197.         }
  198.     }
  199.  
  200. } // class
Add Comment
Please, Sign In to add comment