Para este teme lo que hay que tener clara es la definicion de una lista circular es una especie de lista enlazada simple o doblemente enlazada, pero que posee una característica adicional para el desplazamiento dentro de la lista: esta no tiene fin.
Para que la lista sea sin fin, el puntero siguiente del último elemento apuntará hacia el primer elemento de la lista en lugar de apuntar al valor NULL, como hemos visto en el caso de listas enlazadas simples o doblemente enlazadas.
Caracteristicas Importantes de una Lista Circular
- En las listas circulares, nunca se llega a una posición en la que ya no sea posible desplazarse. Cuando se llegue al último elemento, el desplazamiento volverá a comenzar desde el primer elemento.
- Para tener el control de la lista es mejor guardar ciertos elementos: el primer elemento, el último elemento y el número de elementos. Para ello, otra estructura será utilizada (no es obligatorio, pueden ser utilizadas variables).
- Cualquiera que sea la posición en la lista, los punteros inicio y fin siempre apuntarán hacia el primer y el último elemento respectivamente.
Programa Lista Circular
CLASE NODOCLASE LISTA CIRCULARpublic class Nodo { private int valor; private Nodo siguiente; public void Nodo(){ this.valor = 0; this.siguiente = null; } // Métodos get y set para los atributos. public int getValor() { return valor; } public void setValor(int valor) { this.valor = valor; } public Nodo getSiguiente() { return siguiente; } public void setSiguiente(Nodo siguiente) { this.siguiente = siguiente; }
CLASE MAINpublic class ListaCircular { private Nodo inicio; // Puntero que indica el final de la lista o el ultimo nodo. private Nodo ultimo; // Variable para registrar el tamaño de la lista. private int tamanio; /** * Constructor por defecto. */ public void Lista(){ inicio = null; ultimo = null; tamanio = 0; } /** * Consulta si la lista esta vacia. * @return true si el primer nodo (inicio), no apunta a otro nodo. */ public boolean esVacia(){ return inicio == null; } /** * Consulta cuantos elementos (nodos) tiene la lista. * @return numero entero entre [0,n] donde n es el numero de elementos * que contenga la lista. */ public int getTamanio(){ return tamanio; } /** * Agrega un nuevo nodo al final de la lista circular. * @param valor a agregar. */ public void agregarAlFinal(int valor){ // Define un nuevo nodo. Nodo nuevo = new Nodo(); // Agrega al valor al nodo. nuevo.setValor(valor); // Consulta si la lista esta vacia. if (esVacia()) { // Inicializa la lista agregando como inicio al nuevo nodo. inicio = nuevo; // De igual forma el ultimo nodo sera el nuevo. ultimo = nuevo; // Y el puntero del ultimo debe apuntar al primero. ultimo.setSiguiente(inicio); // Caso contrario el nodo se agrega al final de la lista. } else{ // Apuntamos con el ultimo nodo de la lista al nuevo. ultimo.setSiguiente(nuevo); // Apuntamos con el nuevo nodo al inicio de la lista. nuevo.setSiguiente(inicio); // Como ahora como el nuevo nodo es el ultimo se actualiza // la variable ultimo. ultimo = nuevo; } // Incrementa el contador de tamaño de la lista tamanio++; } /** * Agrega un nuevo nodo al inicio de la lista circular. * @param valor a agregar. */ public void agregarAlInicio(int valor){ // Define un nuevo nodo. Nodo nuevo = new Nodo(); // Agrega al valor al nodo. nuevo.setValor(valor); // Consulta si la lista esta vacia. if (esVacia()) { // Inicializa la lista agregando como inicio al nuevo nodo. inicio = nuevo; // De igual forma el ultimo nodo sera el nuevo. ultimo = nuevo; // Y el puntero del ultimo debe apuntar al primero. ultimo.setSiguiente(inicio); // Caso contrario va agregando los nodos al inicio de la lista. } else{ // Une el nuevo nodo con la lista existente. nuevo.setSiguiente(inicio); // Renombra al nuevo nodo como el inicio de la lista. inicio = nuevo; // El puntero del ultimo debe apuntar al primero. ultimo.setSiguiente(inicio); } // Incrementa el contador de tamaño de la lista. tamanio++; } /** * Inserta un nuevo nodo despues de otro, ubicado por el valor que contiene. * @param referencia valor del nodo anterios al nuevo nodo a insertar. * @param valor del nodo a insertar. */ public void insertarPorReferencia(int referencia, int valor){ // Define un nuevo nodo. Nodo nuevo = new Nodo(); // Agrega al valor al nodo. nuevo.setValor(valor); // Verifica si la lista contiene elementos if (!esVacia()) { // Consulta si el valor existe en la lista. if (buscar(referencia)) { // Crea ua copia de la lista. Nodo aux = inicio; // Recorre la lista hasta llegar al nodo de referencia. while (aux.getValor() != referencia) { aux = aux.getSiguiente(); } // Consulta si el nodo a insertar va despues del ultimo if (aux == ultimo) { // Apuntamos con el ultimo nodo de la lista al nuevo. aux.setSiguiente(nuevo); // Apuntamos con el nuevo nodo al inicio de la lista. nuevo.setSiguiente(inicio); // Como ahora como el nuevo nodo es el ultimo se actualiza // la variable ultimo. ultimo = nuevo; } else { // Crea un respaldo de la continuación de la lista. Nodo siguiente = aux.getSiguiente(); // Enlaza el nuevo nodo despues del nodo de referencia. aux.setSiguiente(nuevo); // Une la continuacion de la lista al nuevo nodo. nuevo.setSiguiente(siguiente); } // Incrementa el contador de tamaño de la lista. tamanio++; } } } /** * Inserta un nuevo nodo despues en una posición determinada. * @param posicion en la cual se va a insertar el nuevo nodo. * @param valor valor del nuevo nodo de la lista. */ public void insrtarPorPosicion(int posicion, int valor){ // Verifica si la posición ingresada se encuentre en el rango // >= 0 y <= que el numero de elementos del la lista. if(posicion>=0 && posicion<=tamanio){ Nodo nuevo = new Nodo(); nuevo.setValor(valor); // Consulta si el nuevo nodo a ingresar va al inicio de la lista. if(posicion == 0){ // Une el nuevo nodo con la lista existente. nuevo.setSiguiente(inicio); // Renombra al nuevo nodo como el inicio de la lista. inicio = nuevo; // El puntero del ultimo debe apuntar al primero. ultimo.setSiguiente(inicio); } else{ // Si el nodo a inserta va al final de la lista. if(posicion == tamanio){ // Apuntamos con el ultimo nodo de la lista al nuevo. ultimo.setSiguiente(nuevo); // Apuntamos con el nuevo nodo al inicio de la lista. nuevo.setSiguiente(inicio); // Como ahora como el nuevo nodo es el ultimo se actualiza // la variable ultimo. ultimo = nuevo; } else{ // Si el nodo a insertar va en el medio de la lista. Nodo aux = inicio; // Recorre la lista hasta llegar al nodo anterior // a la posicion en la cual se insertara el nuevo nodo. for (int i = 0; i < (posicion-1); i++) { aux = aux.getSiguiente(); } // Guarda el nodo siguiente al nodo en la posición // en la cual va a insertar el nevo nodo. Nodo siguiente = aux.getSiguiente(); // Inserta el nuevo nodo en la posición indicada. aux.setSiguiente(nuevo); // Une el nuevo nodo con el resto de la lista. nuevo.setSiguiente(siguiente); } } // Incrementa el contador de tamaño de la lista. tamanio++; } } /** * Obtiene el valor de un nodo en una determinada posición. * @param posicion del nodo que se desea obtener su valor. * @return un numero entero entre [0,n-1] n = numero de nodos de la lista. * @throws Exception */ public int getValor(int posicion) throws Exception{ // Verifica si la posición ingresada se encuentre en el rango // >= 0 y < que el numero de elementos del la lista. if(posicion>=0 && posicion
= 0 y < que el numero de elementos del la lista. if(posicion>=0 && posicion = 0 y < que el numero de elementos del la lista. if(posicion>=0 && posicion "); // Recorre la lista hasta llegar nuevamente al incio de la lista. do{ // Imprime en pantalla el valor del nodo. System.out.print(i + ".[ " + aux.getValor() + " ]" + " -> "); // Avanza al siguiente nodo. aux = aux.getSiguiente(); // Incrementa el contador de la posión. i++; }while(aux != inicio); } } }
public class Main { public static void main(String[] args)throws Exception{ ListaCircular listaCircular = new ListaCircular(); System.out.println("<<-- --="" circular="" de="" ejemplo="" lista="" simple="">>\n"); // Agregar al final de la lista circular listaCircular.agregarAlFinal(12); listaCircular.agregarAlFinal(15); listaCircular.agregarAlFinal(9); // Agregar in inicio de la lista circular listaCircular.agregarAlInicio(41); listaCircular.agregarAlInicio(6); System.out.println("<<-- --="" circular="" lista="">>"); listaCircular.listar(); System.out.println("\n\n<<-- --="" o="" tama="">"); System.out.println(listaCircular.getTamanio()); System.out.println("\n<<-- --="" 3="" del="" el="" en="" la="" nodo="" obtener="" posicion="" valor="">>"); System.out.println(listaCircular.getValor(3)); System.out.println("\nInsrta un nodo con valor 16 despues del 15"); listaCircular.insertarPorReferencia(15, 16); listaCircular.listar(); System.out.print(" | Tamaño: "); System.out.println(listaCircular.getTamanio()); System.out.println("\n\nInsrta un nodo con valor 44 en la posición 5"); listaCircular.insrtarPorPosicion(5, 44); listaCircular.listar(); System.out.print(" | Tamaño: "); System.out.println(listaCircular.getTamanio()); System.out.println("\nActualiza el valor 12 del tercer nodo por 13"); listaCircular.editarPorReferencia(12, 13); listaCircular.listar(); System.out.print(" | Tamaño: "); System.out.println(listaCircular.getTamanio()); System.out.println("\nActualiza el valor nodo en la posición 0 por 17"); listaCircular.editarPorPosicion(0, 17); listaCircular.listar(); System.out.print(" | Tamaño: "); System.out.println(listaCircular.getTamanio()); System.out.println("\nElimina el nodo con el valor 41"); listaCircular.removerPorReferencia(41); listaCircular.listar(); System.out.print(" | Tamaño: "); System.out.println(listaCircular.getTamanio()); System.out.println("\nElimina el nodo en la posición 4"); listaCircular.removerPorPosicion(4); listaCircular.listar(); System.out.print(" | Tamaño: "); System.out.println(listaCircular.getTamanio()); System.out.println("\nConsulta si existe el valor 30"); System.out.println(listaCircular.buscar(30)); System.out.println("\nConsulta la posicion del valor 16"); System.out.println(listaCircular.getPosicion(16)); System.out.println("\nElimina la lista"); listaCircular.eliminar(); System.out.println("\nConsulta si la lista está vacia"); System.out.println(listaCircular.esVacia()); System.out.println("\n\n<<-- --="" de="" ejemplo="" fin="" lista="" simple="">>"); } } -->-->-->-->-->
El metodo listar no existe.
ResponderBorrar