LISTA ENLAZADA CIRCULARES
PYTHON
class Nodo:
def __init__(self, dato):
[Link] = dato
[Link] = None
class ListaEnlazadaCircular:
def __init__(self):
[Link] = None
[Link]ño = 0
def esta_vacia(self):
"""Verifica si la lista está vacía"""
return [Link] is None
def insertar_inicio(self, dato):
"""Inserta un nodo al inicio de la lista"""
nuevo_nodo = Nodo(dato)
if self.esta_vacia():
nuevo_nodo.siguiente = nuevo_nodo # Apunta a sí mismo
[Link] = nuevo_nodo
else:
# Encontrar el último nodo
ultimo = [Link]
while [Link] != [Link]:
ultimo = [Link]
nuevo_nodo.siguiente = [Link]
[Link] = nuevo_nodo
[Link] = nuevo_nodo
[Link]ño += 1
def insertar_final(self, dato):
"""Inserta un nodo al final de la lista"""
nuevo_nodo = Nodo(dato)
if self.esta_vacia():
nuevo_nodo.siguiente = nuevo_nodo
[Link] = nuevo_nodo
else:
ultimo = [Link]
while [Link] != [Link]:
ultimo = [Link]
nuevo_nodo.siguiente = [Link]
[Link] = nuevo_nodo
[Link]ño += 1
def eliminar(self, dato):
"""Elimina la primera ocurrencia del dato"""
if self.esta_vacia():
return False
actual = [Link]
anterior = None
# Caso especial: lista con un solo nodo
if [Link]ño == 1 and [Link] == dato:
[Link] = None
[Link]ño -= 1
return True
# Buscar el nodo a eliminar
while True:
if [Link] == dato:
# Caso: eliminar cabeza
if actual == [Link]:
# Encontrar el último nodo
ultimo = [Link]
while [Link] != [Link]:
ultimo = [Link]
[Link] = [Link]
[Link] = [Link]
else:
[Link] = [Link]
[Link]ño -= 1
return True
anterior = actual
actual = [Link]
# Si hemos dado una vuelta completa
if actual == [Link]:
break
return False
def buscar(self, dato):
"""Busca un dato en la lista"""
if self.esta_vacia():
return False
actual = [Link]
while True:
if [Link] == dato:
return True
actual = [Link]
if actual == [Link]:
break
return False
def mostrar(self):
"""Muestra todos los elementos de la lista"""
if self.esta_vacia():
print("Lista vacía")
return
elementos = []
actual = [Link]
while True:
[Link](str([Link]))
actual = [Link]
if actual == [Link]:
break
print(" -> ".join(elementos) + " → (cabeza)")
def obtener_tamaño(self):
"""Retorna el tamaño de la lista"""
return [Link]ño
def rotar(self, posiciones=1):
"""Rota la lista n posiciones hacia la derecha"""
if self.esta_vacia() or [Link]ño <= 1:
return
posiciones = posiciones % [Link]ño
for _ in range(posiciones):
[Link] = [Link]
if __name__ == "__main__":
lista = ListaEnlazadaCircular()
while True:
print("\nMENÚ DE OPERACIONES")
print("1. Anexar nodo al inicio")
print("2. Anexar nodo al final")
print("3. Borrar nodo")
print("4. Mostrar lista")
print("5. Mostrar tamaño de la lista")
print("6. Buscar elemento")
print("7. Rotar n lugares")
print("8. Salir")
eleccion = input("Digite el número al cual quiere acceder: ")
if eleccion == "1":
dato = input("Ingrese el valor a insertar al inicio: ")
lista.insertar_inicio(dato)
elif eleccion == "2":
dato = input("Ingrese el valor a insertar al final: ")
lista.insertar_final(dato)
elif eleccion == "3":
dato = input("Ingrese el valor a borrar: ")
if [Link](dato):
print("Nodo eliminado.")
else:
print("Nodo no encontrado.")
elif eleccion == "4":
[Link]()
elif eleccion == "5":
print(f"Tamaño de la lista: {lista.obtener_tamaño()}")
elif eleccion == "6":
dato = input("Ingrese el valor a buscar: ")
print("Encontrado" if [Link](dato) else "No encontrado")
elif eleccion == "7":
n = int(input("¿Cuántas posiciones desea rotar? "))
[Link](n)
print("Lista rotada.")
[Link]()
elif eleccion == "8":
print("Saliendo del programa...")
break
else:
print("Opción no válida. Intente de nuevo.")
JAVA
import [Link];
class Nodo {
int dato;
Nodo siguiente;
public Nodo(int dato) {
[Link] = dato;
[Link] = null;
}
}
class ListaEnlazadaCircular {
private Nodo cabeza;
private int tamaño;
public ListaEnlazadaCircular() {
[Link] = null;
[Link]ño = 0;
}
public boolean estaVacia() {
return cabeza == null;
}
public void insertarInicio(int dato) {
Nodo nuevoNodo = new Nodo(dato);
if (estaVacia()) {
[Link] = nuevoNodo;
cabeza = nuevoNodo;
} else {
Nodo ultimo = encontrarUltimo();
[Link] = cabeza;
[Link] = nuevoNodo;
cabeza = nuevoNodo;
}
tamaño++;
}
public void insertarFinal(int dato) {
Nodo nuevoNodo = new Nodo(dato);
if (estaVacia()) {
[Link] = nuevoNodo;
cabeza = nuevoNodo;
} else {
Nodo ultimo = encontrarUltimo();
[Link] = cabeza;
[Link] = nuevoNodo;
}
tamaño++;
}
private Nodo encontrarUltimo() {
if (estaVacia()) return null;
Nodo actual = cabeza;
while ([Link] != cabeza) {
actual = [Link];
}
return actual;
}
public boolean eliminar(int dato) {
if (estaVacia()) return false;
Nodo actual = cabeza;
Nodo anterior = null;
if (tamaño == 1 && [Link] == dato) {
cabeza = null;
tamaño--;
return true;
}
do {
if ([Link] == dato) {
if (actual == cabeza) {
Nodo ultimo = encontrarUltimo();
cabeza = [Link];
[Link] = cabeza;
} else {
[Link] = [Link];
}
tamaño--;
return true;
}
anterior = actual;
actual = [Link];
} while (actual != cabeza);
return false;
}
public boolean buscar(int dato) {
if (estaVacia()) return false;
Nodo actual = cabeza;
do {
if ([Link] == dato) return true;
actual = [Link];
} while (actual != cabeza);
return false;
}
public void mostrar() {
if (estaVacia()) {
[Link]("Lista vacía");
return;
}
StringBuilder elementos = new StringBuilder();
Nodo actual = cabeza;
do {
[Link]([Link]).append(" -> ");
actual = [Link];
} while (actual != cabeza);
[Link]("(cabeza)");
[Link]([Link]());
}
public int obtenerTamaño() {
return tamaño;
}
public void rotar(int posiciones) {
if (estaVacia() || tamaño <= 1) return;
posiciones = posiciones % tamaño;
for (int i = 0; i < posiciones; i++) {
cabeza = [Link];
}
}
// Clase Nodo interna
static class Nodo {
int dato;
Nodo siguiente;
public Nodo(int dato) {
[Link] = dato;
[Link] = null;
}
@Override
public String toString() {
return [Link](dato);
}
}
}
// Clase principal para probar
public class Main {
public static void main(String[] args) {
ListaEnlazadaCircular lista = new ListaEnlazadaCircular();
Scanner sc = new Scanner([Link]);
while (true) {
[Link]("\nMENÚ DE OPERACIONES");
[Link]("1. Anexar nodo al inicio");
[Link]("2. Anexar nodo al final");
[Link]("3. Borrar nodo");
[Link]("4. Mostrar lista");
[Link]("5. Mostrar tamaño de la lista");
[Link]("6. Buscar elemento");
[Link]("7. Rotar n lugares");
[Link]("8. Salir");
[Link]("Digite el número al cual quiere acceder: ");
int eleccion = [Link]();
if (eleccion == 1) {
[Link]("Ingrese el valor a insertar al inicio: ");
int dato = [Link]();
[Link](dato);
[Link]("Nodo insertado al inicio.");
}
else if (eleccion == 2) {
[Link]("Ingrese el valor a insertar al final: ");
int dato = [Link]();
[Link](dato);
[Link]("Nodo insertado al final.");
}
else if (eleccion == 3) {
[Link]("Ingrese el valor a borrar: ");
int dato = [Link]();
boolean eliminado = [Link](dato);
if (eliminado)
[Link]("Nodo eliminado.");
else
[Link]("El valor no existe en la lista.");
}
else if (eleccion == 4) {
[Link]();
}
else if (eleccion == 5) {
[Link]("Tamaño de la lista: " + [Link]ño());
}
else if (eleccion == 6) {
[Link]("Ingrese el valor a buscar: ");
int dato = [Link]();
if ([Link](dato))
[Link]("El valor SÍ existe en la lista.");
else
[Link]("El valor NO existe en la lista.");
}
else if (eleccion == 7) {
[Link]("Ingrese el número de posiciones a rotar: ");
int dato = [Link]();
[Link](dato);
[Link]("Lista rotada.");
[Link]();
}
else if (eleccion == 8) {
[Link]("Saliendo del programa...");
break;
}
else {
[Link]("Opción no válida. Intente de nuevo.");
}
}
[Link]();
}
}