En el post anterior Listas ligadas en Java paso a paso y en Español aprendimos como utilizar listas simplemente ligadas, en este explicaremos como crear listas doblemente ligadas en Java.

A diferencia de las listas simplemente ligadas las listas doblemente ligadas contienen una referencia al nodo siguiente y una al anterior, esto debe ser considerado al momento de agregar los valores al principio y al final de ella.

Creando la clase Nodo


public class Node {
	private Integer value;
	private Node nextElement;
	private Node previousElement;

	public Node(Integer value) {
		this.value = value;
	}

	public Integer getValue() {
		return value;
	}

	public void setValue(Integer value) {
		this.value = value;
	}

	public Node getNextElement() {
		return nextElement;
	}

	public void setNextElement(Node nextElement) {
		this.nextElement = nextElement;
	}

	public Node getPreviousElement() {
		return previousElement;
	}

	public void setPreviousElement(Node previousElement) {
		this.previousElement = previousElement;
	}

	@Override
	public String toString() {
		return "Node [value=" + value + ", nextElement=" + ((nextElement != null) ? nextElement.getValue()
				: null) + ", previousElement=" +( (previousElement != null) ? previousElement.getValue() : null) + "]";
	}

}

Como se puede observar la clase nodo contiene 3 atributos:

  • Integer value : Contiene el valor a almacenar en la lista

  • Node nextElement: Contiene una referencia al nodo siguiente
  • Node previousElement: Contiene una referencia al nodo anterior

Con estos atributos la lista doblemente ligada se verá como la siguiente imagen:

doublylinkedlist

Creando la lista doblemente ligada

Una vez que se ha creado el nodo, el siguiente paso es crear la lista doblemente ligada.


public class DoublyLinkedList {
	private Node tail;
	private Node head;

	public void addLast(Integer value) {
		Node node = new Node(value);
		if (tail == null && head == null) {
			tail = node;
			head = node;
		} else {
			tail.setNextElement(node);
			node.setPreviousElement(tail);
			tail = node;
		}
	}

	public void addFirst(Integer value) {
		Node node = new Node(value);
		if (tail == null && head == null) {
			tail = node;
			head = node;
		} else {
			node.setNextElement(head);
			head.setPreviousElement(node);
			head = node;
		}
	}

	public void print() {
		for (Node i = head; i != null; i = i.getNextElement()) {
			System.out.printf("\t %s ", i.toString());
		}
		System.out.println();
	}
}

El código anterior muestra como realizar las siguientes operaciones en una lista doblemente ligada:

  • void addLast(Integer value) : Agrega un nodo al final de la lista

  • void addFirst(Integer value) : Agrega un nodo al principio de la lista

  • void print() : Imprime los elementos en la lista

Es importante mencionar que cada elemento de la lista debe mantener una referencia tanto al nodo siguiente como al nodo anterior.

Probando la lista

El último paso será probar la lista doblemente ligada, veamos el código:

public class TestDoublyLinkedList {
	public static void main(String[] args) {
		DoublyLinkedList list = new DoublyLinkedList();
		list.addLast(10);
		list.addLast(11);
		list.addLast(12);
		list.addLast(13);
		list.addLast(14);
		list.addFirst(9);
		list.addFirst(8);
		list.print();
	}
}

Salida:

Node [value=8, nextElement=9, previousElement=null] 	 Node [value=9, nextElement=10, previousElement=8] 	 Node [value=10, nextElement=11, previousElement=9] 	 Node [value=11, nextElement=12, previousElement=10] 	 Node [value=12, nextElement=13, previousElement=11] 	 Node [value=13, nextElement=14, previousElement=12] 	 Node [value=14, nextElement=null, previousElement=13]

La salida muestra por cada nodo su valor, su nodo anterior y su nodo siguiente.

Si te gusta el contenido compártelo y no olvides seguirnos en nuestras redes sociales https://twitter.com/geeks_mx y https://www.facebook.com/geeksJavaMexico/.

Autor: Alejandro Agapito Bautista

Twitter: @raidentrance

Contacto:raidentrance@gmail.com