Listas Enlazadas — Método eliminarPrimero

🧹 Implementemos eliminarPrimero()

Vamos a implementar el método eliminarPrimero().
Este método removerá el primer nodo de la lista.

public void eliminarPrimero() {
    // Paso 1: verificar que la lista no esté vacía
}

⚠️ Validación inicial

Antes de eliminar, debemos asegurarnos de que la lista no esté vacía.

import java.util.NoSuchElementException;

public void eliminarPrimero() {
    if (estaVacia())
        throw new NoSuchElementException();
}

✅ Si la lista está vacía → lanzamos una excepción controlada (NoSuchElementException) en lugar de un error inesperado.

🧠 Caso especial — Un solo nodo

Si la lista solo tiene un nodo (primero == ultimo), al eliminarlo debemos dejar ambos en null.

if (primero == ultimo) {
    primero = ultimo = null;
    return;
}

🟨 Así evitamos referencias colgantes y posibles errores.

🧩 Caso general — Mover el puntero

En una lista con más de un nodo:

1️⃣ Guardamos el segundo nodo.

2️⃣ Desconectamos el enlace del primero.

3️⃣ Actualizamos primero al segundo.

var segundo = primero.next;
primero.next = null; // rompe el enlace
primero = segundo;   // avanza el puntero

📊 Visualización — Antes de eliminar

10
➡️
20
➡️
30

➡️ null

primero → 🟨10
     último → 🟩30

Queremos eliminar el primer nodo (valor 10).

🪄 Paso 1 — Referencia al segundo nodo

10
➡️
20
➡️
30

➡️ null

segundo = primero.next
    segundo → 🟦20

Guardamos el segundo nodo antes de romper el enlace.

🪄 Paso 2 — Romper el enlace

10
  ✂️
20
➡️
30

➡️ null

primero.next = null
🧹💨 El nodo 10 queda sin enlaces.

El recolector de basura podrá eliminar el nodo 10.

🪄 Paso 3 — Actualizar puntero primero

10
➡️
20
➡️
30

➡️ null

primero → 🟦20
    último → 🟩30

🎯 Ahora primero apunta al nodo 20, y la lista sigue correctamente enlazada.

📉 Caso especial — Lista con un solo nodo

10

➡️ null

primero → 🟨10
    último → 🟨10

Al eliminar el único nodo, la lista queda vacía: primero = null y último = null

🧱 Implementación completa

public void eliminarPrimero() {
    if (estaVacia())
        throw new NoSuchElementException();

    if (primero == ultimo) {
        primero = ultimo = null;
        return;
    }

    var segundo = primero.next;
    primero.next = null;
    primero = segundo;
}

🧪 Probemos nuestro código

public class Main {
    public static void main(String[] args) {
        var list = new ListaEnlazada();
        list.agregarAlFinal(10);
        list.agregarAlFinal(20);
        list.agregarAlFinal(30);
        System.out.println(list.indiceDe(10));
        list.eliminarPrimero(); // elimina 10
        System.out.println(list.contiene(10)); // true
        System.out.println(list.indiceDe(10));
    }
}
0
false
-1

Así vamos

import java.util.NoSuchElementException;

public class ListaEnlazada {

    private class Nodo {
        private int value;
        private Nodo next;

        public Nodo(int value) {
            this.value = value;
        }
    }

    private Nodo primero;
    private Nodo ultimo;


    public void agregarAlInicio(int item) {
            var nodo = new Nodo(item);

            if (estaVacia()) {
               primero = ultimo = nodo;
            } else {
              nodo.next = primero;
              primero = nodo;
             }
    }

    private boolean estaVacia() {
        return primero == null;
    }

    public void agregarAlFinal(int item) {
        var nodo = new Nodo(item);

        if (primero == null) {
            primero = ultimo = nodo;
        } else {
            ultimo.next = nodo;
            ultimo = nodo;
        }
    }

    public int indiceDe(int item) {
        var actual = primero;
        int indice = 0;

        while (actual != null) {
            if (actual.value == item)
                return indice;

            actual = actual.next;
            indice++;
        }
        return -1;
    }

    public boolean contiene(int item) {
        return indiceDe(item) != -1;
    }

    public void eliminarPrimero() {
        if (estaVacia())
            throw new NoSuchElementException();

        if (primero == ultimo) {
            primero = ultimo = null;
            return;
        }

        var segundo = primero.next;
        primero.next = null;
        primero = segundo;
    }

}