Advertisement
Guest User

Lista enlazada doble

a guest
Oct 20th, 2019
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.93 KB | None | 0 0
  1. //Lista doblemente Enlazada
  2. public class List<E> {
  3.     /**
  4.      * Campos en la estructura interna o privada de la clase
  5.      */
  6.     private Node head;
  7.     private int count;
  8.     private Node tail;
  9.    
  10.     /**
  11.      * Getter para count
  12.      *
  13.      * @return cantidad de elementos en la linea
  14.      */
  15.     public int getCount() {
  16.         return this.count;
  17.     }
  18.    
  19.     /**
  20.      * Constructor por defecto
  21.      */
  22.     public List() {
  23.         this.head = null;
  24.         this.count = 0;
  25.         this.tail = null;
  26.     }
  27.    
  28.     /**
  29.      * Agrega al principio
  30.      * Este codigo puede y debe mejorarse
  31.      *
  32.      * @param item elemento que se agrega a la lista
  33.      */
  34.    
  35.     public void AddFirst(E item) {
  36.         // si esta vacia
  37.         if (this.count == 0) {
  38.             // se crea un nodo con el elemento a agregar
  39.             // el nuevo nodo es el primero y el ultimo
  40.             this.head = this.tail = new Node(item, null, null);
  41.             // incrementa la cuenta de elemento
  42.             ++this.count;
  43.         }
  44.         else {
  45.             // se crea un nodo cone el elemento a agregar
  46.             Node temp = new Node(item, null, null);
  47.             // el siguiente del nuevo nodo es el actual primero
  48.             temp.next = this.head;
  49.             // el anterior del actual primero es el nuevo nodo
  50.             this.head.prev = temp;
  51.             // el nuevo nodo se convierte en el primero
  52.             this.head = temp;
  53.             // incrementa la cuenta de elementos
  54.             ++this.count;
  55.         }
  56.     }
  57.    
  58.     public void Better_AddFirst(E item) {
  59.         Node temp = new Node(item, this.head, null);
  60.         if (this.count == 0) {
  61.             this.tail = temp;
  62.         }
  63.         else {
  64.             this.head.prev = temp;
  65.         }
  66.         this.head = temp;
  67.         ++this.count;
  68.     }
  69.    
  70.     /**
  71.      *Extrae y devuelve el primer elemento de la lista
  72.      *
  73.      * @return el elemento que se encuentra al principio de la lista
  74.      * @exception Lista vacia
  75.      */
  76.    
  77.     public E RemoveFirst() {
  78.         if (this.count == 0) {
  79.             throw new RuntimeException("La lista esta vaciá...");
  80.         }
  81.        
  82.         // toma el elemento que esta en el primer nodo
  83.         E item = this.head.item;
  84.         // avanza el primer nodo al siguiente
  85.         this.head = this.head.next;
  86.         // si no hay mas nodos
  87.         if (this.head == null) {
  88.             // vaciar la lista
  89.             this.tail = null;
  90.         }
  91.         else {
  92.             // suprimir la referencia al anterior en el actual primero
  93.             this.head.prev = null;
  94.         }
  95.         // decrementa la cuenta de elementos
  96.         --this.count;
  97.         // regresar el elemento
  98.         return item;
  99.     }
  100.    
  101.     /**
  102.      *Extrae y devuelve el ultimo elemento de la lista
  103.      *
  104.      * @return el elemento que se encuentra al final de la lista
  105.      * @exception Lista vacia
  106.      */
  107.    
  108.     public E RemoveLast() {
  109.         if (this.count == 0) {
  110.             throw new RuntimeException("La lista esta vaciá...");
  111.         }
  112.        
  113.         E item = this.tail.item;
  114.        
  115.         // si es el unico nodo
  116.         if (this.head.next == null) {
  117.             // vacia la lista
  118.             this.head = this.tail = null;
  119.         }
  120.         else {
  121.             // accede al penultimo nodo que ahora sera el ultimo
  122.             this.tail = this.tail.prev;
  123.             // anula la referencia al siguiente nodo
  124.             this.tail.next = null;
  125.         }
  126.         // decrementa la cuenta de elementos
  127.         --this.count;
  128.         // regresa el elemento
  129.         return item;
  130.     }
  131.    
  132.     /**
  133.      *  Muestra en la salida estándar todo los elementos de la lista
  134.      *  
  135.      *  Para evitar código como este, se aconseja implementar interfaces
  136.      *  que permitan recorrer la lista, como ser Iterable e Iterator
  137.      *  
  138.      */
  139.    
  140.     public void Mostrar() {
  141.         for (Node skip = this.head; skip != null; skip = skip.next) {
  142.             System.out.printf("%s ", skip.toString());
  143.         }
  144.     }
  145.    
  146.     /**
  147.      * Agrega al final
  148.      * Este codigo puede y debe mejorarse
  149.      *
  150.      * @param item elemento que se agrega a la lista
  151.      */
  152.    
  153.     public void AddLast(E item) {
  154.         if (this.count == 0) {
  155.             // se crea un nodo con el elemento a agregar
  156.             // el nuevo nodo es el primero y el ultimo
  157.             this.head = this.tail = new Node(item, null, null);
  158.             // se incrementa la cuenta de elementos
  159.             ++this.count;
  160.         }
  161.         else {
  162.             // se crea un nodo con el elemento a agregar
  163.             Node temp = new Node(item, null, null);
  164.             // el anterior del nuevo nodo es el actual ultimo
  165.             temp.prev = this.tail;
  166.             // el siguiente del actual ultimo es el nuevo nodo
  167.             this.tail.next = temp;
  168.             // el nuevo es ahora el ultimo
  169.             this.tail = temp;
  170.             // se incrementa la cuenta de elementos
  171.             ++this.count;
  172.         }
  173.     }
  174.    
  175.     public void Better_AddLast(E item) {
  176.         Node temp = new Node(item, null, this.tail);
  177.         if (this.count == 0) {
  178.             this.head = temp;
  179.         }
  180.         else {
  181.             this.tail.next = temp;
  182.         }
  183.         this.tail = temp;
  184.         ++this.count;
  185.     }
  186.    
  187.    
  188.    
  189.     private class Node {
  190.    
  191.     /**
  192.      * Campos en la estructura interna o privada de la clase
  193.      */
  194.     public E item;
  195.     public Node next;
  196.     public Node prev;
  197.    
  198.     //Constructor por defecto
  199.     public Node() {
  200.         this(null, null, null);
  201.     }
  202.    
  203.     //Constructor especializado
  204.     public Node(E item) {
  205.         this(item, null, null);
  206.     }
  207.    
  208.  
  209.     //Constructor especializado
  210.     public Node(E item, Node next, Node prev) {
  211.         this.item = item;
  212.         this.next = next;
  213.         this.prev = prev;
  214.     }
  215.    
  216.     //Devuelve una cadena de texto que representa el contenido
  217.     public String toString() {
  218.         return this.item.toString();
  219.     }
  220.     }
  221.    
  222.  
  223. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement