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