Listas Enlazadas Dobles


Hoy are un repaso en las listas enlazadas dobles. 

Un Nodo tiene tres campos: un campo izquierda, un campo de información y un campo derecha. Los campos izquierda y derecha son apuntadores a los nodos ubicados en el lado izquierdo y el derecho de cada nodo
 Listas dobles en java algoritmos

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;
 }
}

0 Comentarios