Cómo crear una LISTA CIRCULAR en Java ☕
Si estás buscando cómo crear una lista circular en Java,
estás en el lugar correcto. En este artículo, te guiaremos a través de los
pasos para crear una lista circular en Java. Pero antes de profundizar en el
proceso de creación de una lista circular, es importante que comprendas qué es
una lista circular y cómo se utiliza en la programación.
REPOSITORIO EN GITHUB - ESTRUCTURA DE DATOS
Una lista circular es una estructura de datos en la que el
último elemento está vinculado al primer elemento, creando un bucle cerrado. Es
decir, en lugar de terminar en null, el último elemento de la lista apunta al
primer elemento. Esto permite un acceso rápido y fácil a los elementos de la
lista, ya que no es necesario recorrer toda la lista para llegar al final o al
principio.
Java es un lenguaje de programación orientado a objetos, lo
que significa que utiliza objetos para representar los datos y las acciones del
programa. Java también es un lenguaje muy popular para la programación de
estructuras de datos, como las listas circulares.
Ahora que ya sabemos lo que es una lista circular y por qué
es útil, es hora de ver cómo podemos crear una en Java. Para este caso vamos a estar manejando Estudiantes dentro de la lista circular, por lo que el tipo de dato es una clase Estudiante.
Clase Nodo para lista circular
La clase Nodo representa un nodo de la lista circular. Cada
nodo tendrá dos propiedades: data (los datos que se almacenan en el nodo) y siguiente
(el siguiente nodo en la lista).
package Listas.ListaCirular;
public class Nodo {
private Estudiante dato;
private Nodo siguiente;
public Nodo(Estudiante dato, Nodo siguiente) {
this.dato = dato;
this.siguiente = siguiente;
}
//Getter and Setter
public Estudiante getDato() {
return dato;
}
public void setDato(Estudiante dato) {
this.dato = dato;
}
public Nodo getSiguiente() {
return siguiente;
}
public void setSiguiente(Nodo siguiente) {
this.siguiente = siguiente;
}
}
Clase ListaCircular
La clase ListaCircular representa la lista circular en sí. Cada lista circular tendrá una propiedad: head (el primer nodo en la lista), a la misma vez esta va a contener todos las funciones o métodos de una lista circular, tales como agregar, eliminar, imprimir (mostrar) entre otros.package Listas.ListaCirular;
public class ListaCircular {
private Nodo inicio;
private Nodo fin;
private int cantidad;
public ListaCircular() {
this.inicio = null;
this.fin = null;
this.cantidad = 0;
}
public boolean vacia() {
return inicio == null && fin == null;
}
public void agregarInicio(Estudiante dato) {
if (vacia()) {
inicio = fin = new Nodo(dato, inicio);
} else {
inicio = new Nodo(dato, inicio);
}
fin.setSiguiente(inicio);
cantidad++;
}
public void agregarFinal(Estudiante dato) {
if (vacia()) {
inicio = fin = new Nodo(dato, inicio);
} else {
Nodo nuevo = new Nodo(dato, inicio);
fin.setSiguiente(nuevo);
fin = nuevo;
}
cantidad++;
}
public void insertarOrdenado(Estudiante dato) {
if (!vacia()) {
if (dato.getEdad() <= inicio.getDato().getEdad()) {
agregarInicio(dato);
} else if (dato.getEdad() >= fin.getDato().getEdad()) {
agregarFinal(dato);
} else {
Nodo aux = inicio;
while (dato.getEdad() >= aux.getSiguiente().getDato().getEdad()) {
aux = aux.getSiguiente();
}
Nodo nuevo = new Nodo(dato, aux.getSiguiente());
aux.setSiguiente(nuevo);
cantidad++;
}
} else {
agregarFinal(dato);
}
}
public void eliminar() {
if (!vacia()) {
Nodo aux = inicio;
while (aux != fin) {
if (inicio.getDato().getEdad() < 18) {
eliminarPrimero();
aux = inicio;
} else if (aux.getSiguiente().getDato().getEdad() < 18) {
if (aux.getSiguiente() == fin) {
fin = aux;
fin.setSiguiente(inicio);
} else {
aux.setSiguiente(aux.getSiguiente().getSiguiente());
}
cantidad--;
} else {
aux = aux.getSiguiente();
}
}
if (inicio == fin && inicio.getDato().getEdad() < 18) {
fin = inicio = null;
cantidad--;
}
}
}
public void eliminarPrimero() {
if (!vacia()) {
if (inicio == fin) {
inicio = fin = null;
} else {
inicio = inicio.getSiguiente();
fin.setSiguiente(inicio);
}
cantidad--;
}
}
public void eliminarUltimo() {
if (!vacia()) {
if (inicio == fin) {
inicio = fin = null;
} else {
Nodo aux = inicio;
while (aux.getSiguiente() != fin) {
aux = aux.getSiguiente();
}
fin = aux;
fin.setSiguiente(inicio);
}
cantidad--;
}
}
public void girarRuleta() {
int aleatorio = (int) (Math.random() * 30 + 1);
System.out.println("aleatorio " + aleatorio);
if (aleatorio > cantidad) {
aleatorio = aleatorio % cantidad;
}
if (aleatorio % cantidad == 0) {
eliminarPrimero();
return;
}
Nodo aux = inicio;
for (int i = 1; i < aleatorio; i++) {
aux = aux.getSiguiente();
}
if (aux.getSiguiente() == fin) {
fin = aux;
fin.setSiguiente(inicio);
} else {
aux.setSiguiente(aux.getSiguiente().getSiguiente());
}
cantidad--;
}
String lista = ""; public String mostrar() {
if (!vacia()) {
Nodo aux = inicio;
do {
lista += aux.getDato() + "\n";
aux = aux.getSiguiente();
} while (aux != inicio);
}
return lista;
}
//Getter and Setter
public Nodo getInicio() {
return inicio;
}
public void setInicio(Nodo inicio) {
this.inicio = inicio;
}
public Nodo getFin() {
return fin;
}
public void setFin(Nodo fin) {
this.fin = fin;
}
public int getCantidad() {
return cantidad;
}
public void setCantidad(int cantidad) {
this.cantidad = cantidad;
}
}
Clase Estudiante
Como se mencionó en un inicio, se necesita la creación de una clase Estudiante ya que ella es el tipo de dato que se está almacenando en la lista, la creamos con atributos básicos como código, nombre, programa, edad y promedio.package Listas.ListaCirular;
public class Estudiante {
private int codigo;
private String nombre;
private String programa;
private int edad;
private float promedio;
public Estudiante() {
}
public Estudiante(int codigo, String nombre, String programa, int edad, float promedio) {
this.codigo = codigo;
this.nombre = nombre;
this.programa = programa;
this.edad = edad;
this.promedio = promedio;
}
public int getCodigo() {
return codigo;
}
public void setCodigo(int codigo) {
this.codigo = codigo;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getPrograma() {
return programa;
}
public void setPrograma(String programa) {
this.programa = programa;
}
public int getEdad() {
return edad;
}
public void setEdad(int edad) {
this.edad = edad;
}
public float getPromedio() {
return promedio;
}
public void setPromedio(float promedio) {
this.promedio = promedio;
}
@Override
public String toString() {
return "Estudiante{" + "codigo=" + codigo + ", nombre=" + nombre + ", programa=" + programa + ", edad=" + edad + ", promedio=" + promedio + '}';
}
}
Ahora solo nos queda crear la Clase Main y usar la lista circular, para poderla usar hacemos lo siguiente.
package Listas.ListaCirular;
public class Main {
public static void main(String[] args) {
ListaCircular listaCir = new ListaCircular();
String programas [] = {"Contaduría", "Administración", "Biología", "Química", "Sistemas"};
for (int i = 1; i <= 8; i++) {
int codigo = (int) (Math.random() * 1000) + 1000;
int edad = (int) (Math.random() * 10) + 13;
float nota = (float) (Math.random() * 4 + 1);
listaCir.insertarOrdenado(new Estudiante(codigo, "Estudiante " + i, programas[(int) (Math.random() * 5)], edad, nota));
}
System.out.println(listaCir.mostrar());
listaCir.girarRuleta();
System.out.println(listaCir.mostrar());
}
}
En conclusión, crear una lista circular en Java puede parecer desafiante al principio, pero siguiendo estos sencillos pasos, puedes crear fácilmente una lista circular que te ayudará a trabajar con datos de manera más eficiente. Esperamos que este artículo te haya sido útil y que puedas.