JuanMtz

ListaEnlazada2.java

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