Listas Enlazadas Dobles
Hoy are un repaso en las listas enlazadas dobles.
El primer nodo en el campo de la izquierda apunta a null. El ultimo nodo en su campo derecho apunta a null. Una de las ventajas que permite es que estando el cualquier nodo se puede acceder al nodo anterior o al siguiente, lo que no se podía hacer en las listas enlazadas simples.
Parece complejo pero es mas simple aqui el codigo
public class Nodo_Doble<Object> { //Atributos del nodo que son los 3 campos que alamacena private Object datos; private Nodo_Doble<Object> siguiente, anterior; /** * @param dato */ public Nodo_Doble(Object dato){ this.datos=dato; this.siguiente=null; } public Object getDatos() { return datos; } public void setDatos(Object datos) { this.datos = datos; } public Nodo_Doble getSiguiente() { return siguiente; } public void setSiguiente(Nodo_Doble siguiente) { this.siguiente = siguiente; } public Nodo_Doble getAnterior() { return anterior; } public void setAnterior(Nodo_Doble anterior) { this.anterior = anterior; } }
public class ListaDoble<Object> { private Nodo_Doble<Object> inicio, fin; public ListaDoble(){ this.inicio=null; this.fin=null; } public void insertarinicio(Object dato){ Nodo_Doble<Object> nuevo = new Nodo_Doble<Object>(dato); if(vacia()){ this.fin=nuevo; }else{ //coloco el nodo actual como siguietene para el nuevo nodod nuevo.setSiguiente(this.inicio); //coloco el nodo actual como anterior al nuevo this.inicio.setAnterior(nuevo); } this.inicio=nuevo; } public void insertarfinal(Object dato){ Nodo_Doble<Object> nuevo = new Nodo_Doble<Object>(dato); if(vacia()){ this.inicio=nuevo; }else{ //el nuevo nodo le asigno que el anterior es el que esta del ultimas actualmente nuevo.setAnterior(this.fin); //el nodo del final le digo que el despues de el va estar el nodo nuevo this.fin.setSiguiente(nuevo); } this.fin=nuevo; } public String toString(){ String respuesta=""; for(Nodo_Doble<Object> x =this.inicio;x!=null;x= x.getSiguiente()){ respuesta = respuesta+x.getDatos()+ " "; } return respuesta; } public void eliminar_de_posision(int pos){ if(pos==0) eliminar_del_inicio(); if(pos == tamaño()-1) eliminar_del_fin(); else{ Nodo_Doble<Object> x = this.inicio; //Para llegar a la posision que me da while(x!=null & pos!=0){ x=x.getSiguiente(); pos--; } if(x!=null){ x.getAnterior().setSiguiente(x.getSiguiente()); if(x.getSiguiente()!=null){ x.getSiguiente().setAnterior(x.getAnterior()); } } } } public Object eliminar_del_inicio(){ Object elemento_eliminado=null; //Si la lina no esta vacia if(!vacia()){ elemento_eliminado= this.inicio.getDatos(); if(this.inicio==this.fin){ this.inicio=this.fin=null; }else{ this.inicio=this.inicio.getSiguiente(); this.inicio.setAnterior(null); } } return elemento_eliminado; } public Object eliminar_del_fin(){ Object elemento_eliminado=null; if(!vacia()){ elemento_eliminado = this.fin.getDatos(); if(this.inicio==this.fin){ this.fin=this.fin=null; }else{ this.fin = this.fin.getAnterior(); this.fin.setSiguiente(null); } } return elemento_eliminado; } public int tamaño(){ int contador=0; for(Nodo_Doble<Object> x = this.inicio; x!=null;x=x.getSiguiente()){ contador++; } return contador; } private Boolean vacia(){ return this.inicio == null && this.fin==null; } }