Implementación Avanzada de Listas Enlazadas Simples en Java: Operaciones CRUD Esenciales

Enviado por Chuletator online y clasificado en Informática y Telecomunicaciones

Escrito el en español con un tamaño de 5,69 KB

Especificación del Ejercicio: Lista Enlazada de Enteros

Este documento presenta la implementación completa de una Lista Enlazada Simple (ListaEnlazada) en Java, incluyendo la definición de la clase Nodo y la clase principal de prueba (MainListaEnlazadaEnteros2). Como adición al ejercicio anterior, la lista enlazada debe soportar las siguientes operaciones fundamentales, las cuales han sido desarrolladas:

Operaciones Requeridas en la Clase ListaEnlazada

  • public void aniadirAlFinal(int dato): Añade un nodo al final de la lista.
  • public void aniadirAlPrincipio(int dato): Añade un nodo al inicio de la lista.
  • public void recorrerLista(): Recorre la lista imprimiendo los datos de los nodos por consola.
  • public boolean existeElemento(int dato): Devuelve true si el dato está presente en la colección.
  • public boolean insertaElementoDespuesDe(int datoABuscar, int datoAInsertar): Inserta el dato datoAInsertar después de la primera ocurrencia de datoABuscar. Devuelve true si la inserción fue exitosa; de lo contrario, devuelve false.
  • public boolean borraElemento(int dato): Borra la primera ocurrencia del dato especificado en la lista.

Implementación en Java

Clase Nodo: Definición de la Estructura Básica

class Nodo {
    int dato; // Almacena el valor del nodo
    Nodo siguiente; // Referencia al siguiente nodo en la lista

    // Constructor para inicializar un nodo con un dato
    public Nodo(int dato) {
        this.dato = dato;
        this.siguiente = null;
    }
}

Clase ListaEnlazada: Gestión de Operaciones

class ListaEnlazada {
    private Nodo cabeza; // Primer nodo de la lista

    // Constructor que inicializa la lista como vacía
    public ListaEnlazada() {
        this.cabeza = null;
    }

    // Método para añadir un nodo al final de la lista
    public void aniadirAlFinal(int dato) {
        Nodo nuevo = new Nodo(dato);
        if (cabeza == null) {
            cabeza = nuevo;
        } else {
            Nodo actual = cabeza;
            while (actual.siguiente != null) {
                actual = actual.siguiente;
            }
            actual.siguiente = nuevo;
        }
    }

    // Método para añadir un nodo al inicio de la lista
    public void aniadirAlPrincipio(int dato) {
        Nodo nuevo = new Nodo(dato);
        nuevo.siguiente = cabeza;
        cabeza = nuevo;
    }

    // Método para recorrer la lista e imprimir los datos
    public void recorrerLista() {
        Nodo actual = cabeza;
        while (actual != null) {
            System.out.print(actual.dato + " -> ");
            actual = actual.siguiente;
        }
        System.out.println("null");
    }

    // Método que verifica si un elemento existe en la lista
    public boolean existeElemento(int dato) {
        Nodo actual = cabeza;
        while (actual != null) {
            if (actual.dato == dato) {
                return true;
            }
            actual = actual.siguiente;
        }
        return false;
    }

    // Método que inserta un elemento después de un dato específico
    public boolean insertaElementoDespuesDe(int datoABuscar, int datoAInsertar) {
        Nodo actual = cabeza;
        while (actual != null) {
            if (actual.dato == datoABuscar) {
                Nodo nuevo = new Nodo(datoAInsertar);
                nuevo.siguiente = actual.siguiente;
                actual.siguiente = nuevo;
                return true;
            }
            actual = actual.siguiente;
        }
        return false;
    }

    // Método que borra la primera ocurrencia de un dato específico
    public boolean borraElemento(int dato) {
        if (cabeza == null) return false; // Si la lista está vacía, no se puede borrar

        if (cabeza.dato == dato) { // Si el primer nodo es el que se debe borrar
            cabeza = cabeza.siguiente;
            return true;
        }

        Nodo actual = cabeza;
        while (actual.siguiente != null) {
            if (actual.siguiente.dato == dato) {
                actual.siguiente = actual.siguiente.siguiente;
                return true;
            }
            actual = actual.siguiente;
        }

        return false; // No se encontró el dato en la lista
    }
}

Clase Principal MainListaEnlazadaEnteros2 y Pruebas de Funcionalidad

public class MainListaEnlazadaEnteros2 {
    public static void main(String[] args) {
        ListaEnlazada lista = new ListaEnlazada();

        // Añadir elementos al final
        System.out.println("--- Añadiendo elementos al final (10, 20, 30) ---");
        lista.aniadirAlFinal(10);
        lista.aniadirAlFinal(20);
        lista.aniadirAlFinal(30);
        lista.recorrerLista();

        // Añadir elementos al principio
        System.out.println("--- Añadiendo elemento al principio (5) ---");
        lista.aniadirAlPrincipio(5);
        lista.recorrerLista();

        // Verificar existencia de elementos
        System.out.println("--- Verificando existencia ---");
        System.out.println("¿Existe el 20?: " + lista.existeElemento(20));

        // Insertar un elemento después de un valor específico
        System.out.println("--- Insertando 25 después de 20 ---");
        lista.insertaElementoDespuesDe(20, 25);
        lista.recorrerLista();

        // Borrar un elemento específico
        System.out.println("--- Borrando la primera ocurrencia de 10 ---");
        lista.borraElemento(10);
        lista.recorrerLista();
    }
}

Entradas relacionadas: