You are on page 1of 5

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

You might also like