agregarAlInicioagregarAlInicio()Bien, implementemos el método agregarAlInicio, muy parecido a agregarAlFinal.
agregarAlInicio()El primer paso es encapsular el valor dentro de un objeto Nodo.
Ahora tenemos dos escenarios posibles:
Si la lista está vacía → el nuevo nodo será tanto el primero como el último.
Si no está vacía → este nodo debe apuntarle al antiguo primero.
20
➡️
30
➡️ null
🟦 Nodo 20 → 🟩 Nodo 30 → null 📍 primero apunta a 20 📍 ultimo apunta a 30
10
➡️
20
➡️
30
➡️ null
🟨 Creamos un nuevo nodo con valor 10, pero aún no está conectado al resto.
nodo.next = primero10
➡️
20
➡️
30
➡️ null
📌 Ahora el nuevo nodo 10 apunta hacia 20 (el antiguo primero).
primero10
➡️
20
➡️
30
➡️ null
primero. El puntero ultimo sigue en el nodo 30.Así el nuevo nodo se coloca al comienzo de la lista, enlazando hacia el nodo que antes era el primero.
estaVacia()Podemos hacer que el código sea más legible creando un método auxiliar para verificar si la lista está vacía.
estaVacia() aplicadoAhora podemos limpiar nuestro método agregarAlInicio():
estaVacia() aplicadoMucho más limpio y mantenible.
Así evitamos repetir la comparación primero == null en varios lugares.
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;
}
}
}Al finalizar, primero tendrá el valor 10 y ultimo seguirá apuntando al nodo con 30.
list
├── primero → nodo(value=10)
│ └── next → nodo(value=20)
│ └── next → nodo(value=30)
└── ultimo → nodo(value=30)
✅ Todo está correctamente enlazado. El nuevo nodo se agregó al inicio de la lista.