eliminarPrimeroeliminarPrimero()Vamos a implementar el método eliminarPrimero().
Este método removerá el primer nodo de la lista.
Antes de eliminar, debemos asegurarnos de que la lista no esté vacía.
✅ Si la lista está vacía → lanzamos una excepción controlada (NoSuchElementException) en lugar de un error inesperado.
Si la lista solo tiene un nodo (primero == ultimo), al eliminarlo debemos dejar ambos en null.
🟨 Así evitamos referencias colgantes y posibles errores.
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.
➡️ null
primero → 🟨10
último → 🟩30
Queremos eliminar el primer nodo (valor 10).
➡️ null
segundo = primero.next
segundo → 🟦20
Guardamos el segundo nodo antes de romper el enlace.
➡️ null
primero.next = null
🧹💨 El nodo 10 queda sin enlaces.
El recolector de basura podrá eliminar el nodo 10.
primero➡️ null
primero → 🟦20
último → 🟩30
🎯 Ahora primero apunta al nodo 20, y la lista sigue correctamente enlazada.
➡️ null
primero → 🟨10
último → 🟨10
Al eliminar el único nodo, la lista queda vacía: primero = null y último = null ✅
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
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;
}
}