Listas Enlazadas Circulares Dobles
Listas Enlazadas Circulares Dobles
Introduccin
El objetivo de este artculo es que el lector comprenda lo que son las listas circulares
dobles.
Resea
La lista circular doble es una especie de lista enlazada doblemente enlazada, pero
que posee una caracterstica adicional para el desplazamiento dentro de la lista, sta no
tiene fin y tiene 2 apuntadores a si misma.
Para que la lista sea sin fin, el puntero siguiente del ltimo elemento apuntar hacia el 1er
elemento y el puntero anterior del primer elemento apuntara hacia el ultimo elemento de
la lista en lugar de apuntar al valor NULL, como hemos visto en el caso de listas enlazadas
simples o doblemente enlazadas.
En las listas circulares dobles, nunca se llega a una posicin en la que ya no sea posible
desplazarse.
Cuando se llegue al ltimo elemento, el desplazamiento volver a comenzar desde el primer
elemento.
Los operaciones bsicas de una lista circular doble son:
Insertar: inserta un nodo con dato x en la lista, pudiendo realizarse esta insercin al principio o
final de la lista o bien en orden.
Eliminar: elimina un nodo de la lista, puede ser segn la posicin o por el dato.
Buscar: busca un elemento en la lista.
Localizar: obtiene la posicin del nodo en la lista.
Imprimir: imprime los elementos de la lista.
Imgenes
Cdigo
Nodo principal
public class Nodo {
private Integer dato;
private Nodo anterior;
private Nodo siguiente;
Mtodo Insertar al inicio
public void insertarInicio(Integer d){
Nodo nuevo=new Nodo(d);
if(inicio==null)
inicio=nuevo;
else{
Nodo aux=inicio;
while(aux.getSiguiente()!=inicio)
aux=aux.getSiguiente();
aux.setSiguiente(nuevo);
nuevo.setAnterior(aux);
nuevo.setSiguiente(inicio);
inicio.setAnterior(nuevo);
inicio=nuevo;
}
}
Mtodo insertar al final
public void insertarFinal(Integer d){
Nodo nuevo=new Nodo(d);
if(inicio==null)
inicio=nuevo;
else{
Nodo aux=inicio;
while(aux.getSiguiente()!=inicio)
aux=aux.getSiguiente();
aux.setSiguiente(nuevo);
nuevo.setAnterior(aux);
nuevo.setSiguiente(inicio);
inicio.setAnterior(nuevo);
}
}
Mtodo insertar ordenadamente
public void agregarOrdenados(Integer d){
Nodo nuevo=new Nodo(d);
if(inicio==null)
inicio=nuevo;
else{
Nodo aux=inicio;
while((aux.getSiguiente()!=inicio) && (aux.getDato()<d)){
aux=aux.getSiguiente();
}
if((aux.getSiguiente()==inicio) && (aux.getDato()<d)){
aux.setSiguiente(nuevo);
nuevo.setAnterior(aux);
nuevo.setSiguiente(inicio);
inicio.setAnterior(nuevo);
}else{
Nodo ant=aux.getAnterior();
nuevo.setAnterior(ant);
ant.setSiguiente(nuevo);
nuevo.setSiguiente(aux);
aux.setAnterior(nuevo);
if((aux==inicio) && (inicio.getDato()>d))
inicio=nuevo;
}
}
}
Mtodo imprimir
public void imprimir(){
if(inicio==null)
System.out.println("<-->NULL<-->");
else{
Nodo aux=inicio;
System.out.print("<--> Inicio");
do{
System.out.print(" <--> "+aux.getDato());
aux=aux.getSiguiente();
}while(aux!=inicio);
System.out.println(" <-->NULL<-->");
}
}
Mtodo buscar elemento
public boolean buscar(Integer d){
Nodo aux=inicio;
while((aux.getSiguiente()!=inicio) && (!(aux.getDato().equals(d))))
aux=aux.getSiguiente();
return aux.getDato().equals(d);
}
Mtodo Eliminar por posicin
public void eliminaPosicion(int p) throws ListaVacia, FueraDeRango{
if(inicio!=null){
if(p>0){
int cont =1;
Nodo aux=inicio;
while((aux.getSiguiente()!=inicio) && (cont<p)){
cont++;
aux=aux.getSiguiente();
}
if(cont==1){
if(aux.getSiguiente()==inicio)
inicio=null;
else{
Nodo ant=aux.getAnterior();
ant.setSiguiente(aux.getSiguiente());
aux=aux.getSiguiente();
aux.setAnterior(ant);
inicio=aux;
}
}else{
Nodo ant=aux.getAnterior();
aux.setAnterior(null);
ant.setSiguiente(aux.getSiguiente());
aux=aux.getSiguiente();
aux.setAnterior(ant);
}
}else
throw new FueraDeRango();
}else
throw new ListaVacia();
}
Mtodo Eliminar por valor
public void eliminaValor(Integer d) throws ListaVacia{
if(inicio!=null){
Nodo aux=inicio;
Nodo ant=null;
while(aux.getSiguiente()!=inicio){
if(aux.getDato().equals(d)){
if(ant==null){
if(aux.getSiguiente()==inicio)
inicio=null;
else{
ant=aux.getAnterior();
ant.setSiguiente(aux.getSiguiente());
aux=aux.getSiguiente();
aux.setAnterior(ant);
inicio=aux;
ant=null;
}
}else{
aux.setAnterior(null);
ant.setSiguiente(aux.getSiguiente());
aux=aux.getSiguiente();
aux.setAnterior(ant);
}
}else{
ant=aux;
aux=aux.getSiguiente();
}
}
}else
throw new ListaVacia();
}