INGENIERIA DE SISTEMAS ESTRUCTURAS DE DATOS LISTAS ENLAZADAS CIRCULARES Una lista circular es una lista lineal en la que el último nodo apunta al primero (no existe null). cab 4 7 8 0 Al igual que en las listas enlazadas, para trabajar con listas circulares utilizaremos la clase Nodo, la clase ListaC y la clase Prueba. CLASE Nodo. public class Nodo { int info; Nodo enlace; public Nodo(int a) { info=a; } } CLASE ListaC, public class ListaC { Nodo cab; void insertar(int a){ if(cab==null){ cab=new Nodo(a); cab.enlace=cab; } else{ Nodo temp=new Nodo(a); Nodo aux=cab; while(aux.enlace!=cab) aux=aux.enlace; aux.enlace=temp; temp.enlace=cab; } } void mostrar(){ if(cab!=null){ Nodo aux=cab; do { System.out.print(aux.info+" "); aux=aux.enlace; } while(aux!=cab); } } } INGENIERIA DE SISTEMAS ESTRUCTURAS DE DATOS CLASE Prueba public class Prueba { public static void main(String[] args) { ListaC l=new ListaC(); l.insertar(1); l.insertar(2); l.insertar(3); l.insertar(4); l.insertar(5); l.mostrar(); } } LISTAS DOBLEMENTE ENLAZADAS Un tipo de lista enlazada más sofisticado es la lista doblemente enlazada o lista enlazada de dos vías. Cada nodo tiene dos enlaces: uno apunta al nodo anterior, o apunta al valor NULL o a la lista vacía si es el primer nodo; y otro que apunta al siguiente nodo siguiente, o apunta al valor NULL o a la lista vacía si es el último nodo. first (primer Nodo) NULL 3 4 last (ultimo Nodo) 2 5 1 NULL Un Nodo de una lista doblemente enlazada tiene tres campos info Anterior 3 Siguiente La declaración de un Nodo de una lista doblemente enlazada en JAVA seria: class Nodo { int info; Nodo siguiente,anterior; //constructor Nodo(int a) { info=a; siguiente=anterior=null; } } Para poder realizar acciones sobre la lista doblemente enlazada utilizaremos la clase Lista en la cual estarán todas las funciones sobre la lista doblemente enlazada como. insertar, eliminar, mostrar, etc. INGENIERIA DE SISTEMAS ESTRUCTURAS DE DATOS class Lista { //first primer elemento, last ultimo elemento Nodo first,last; void insertar(int a) { //if no hay datos if(first==null) { first=new Nodo(a); last=first; } //si por lo menos hay un dato else { //crea un nuevo nodo temp Nodo temp=new Nodo(a); last.siguiente=temp; temp.anterior=last; last=temp; } } void mostrarAdelante() { Nodo aux=first; while(aux!=null) { System.out.print(aux.info); aux=aux.siguiente; } } void mostrarAtras() { Nodo aux=last; while(aux!=null) { System.out.print(aux.info); aux=aux.anterior; } } void insertarOrdenado(int a) { //si no hay nodos if(first==null) { first=new Nodo(a); last=first; } //si por lo menos hay un nodo else { //creamos un nuevo nodo Nodo temp=new Nodo(a); //si el nodo a insertar es menor que el primer dato if(temp.info<first.info) { temp.siguiente=first; first.anterior=temp; first=temp; } else { Nodo aux=first.siguiente; INGENIERIA DE SISTEMAS ESTRUCTURAS DE DATOS Nodo antes=first; while(aux!=null && temp.info>aux.info) { aux=aux.siguiente; antes=antes.siguiente; } antes.siguiente=temp; temp.anterior=antes; if(aux!=null) { temp.siguiente=aux; aux.anterior=temp; } else last=temp; } } } } A partir de estas clases podremos realizar cualquier programa: public class prueba { public static void main(String[] args) { Lista l=new Lista(); l.insertarOrdenado(2); l.insertarOrdenado(1); l.insertarOrdenado(8); l.insertarOrdenado(5); l.insertarOrdenado(6); l.insertarOrdenado(10); l.insertarOrdenado(2); l.mostrarAdelante(); System.out.println(); l.mostrarAtras(); } } Ejemplo.- programa que permite insertar ordenadamente N números por teclado en una lista doblemente enlazada y posteriormente visualiza en forma invertida import java.util.*; public class prueba { public static void main(String[] args) { Scanner en=new Scanner(System.in); Lista l=new Lista(); int N=en.nextInt(); for(int i=0;i<N;i++) l.insertarOrdenado(en.nextInt()); l.mostrarAtras(); } }