agregarAlFinalagregarAlFinal()Bien, comencemos implementando el método agregarAlFinal.
agregarAlFinal()public void agregarAlFinal(int item) {
// Paso 1: crear un nuevo nodo con el valor recibido
Nodo nodo = new nodo();
}El primer paso es encapsular el valor dentro de un objeto Nodo.
agregarAlFinal()public void agregarAlFinal(int item) {
// Paso 1: crear un nuevo nodo con el valor recibido
var nodo = new nodo();
}Usamos var para que el compilador detecte el tipo automáticamente.
agregarAlFinal()public void agregarAlFinal(int item) {
// Paso 1: crear un nuevo nodo con el valor recibido
var nodo = new Nodo(item);
nodo.value = item;
}Queremos asignar nodo.value = item, pero este campo está declarado como privado.
NodoEn lugar de usar un setter, observemos algo:
La clase
nodoforma parte de la implementación interna de nuestra lista enlazada.
Por lo tanto, no necesitamos exponerla fuera de la clase ListaEnlazada.
NodoEn lugar de usar un setter:
nodopublic class ListaEnlazada {
private class Nodo {
private int value;
private Nodo next;
}
private Nodo primero;
private Nodo ultimo;
public void agregarAlFinal(int item) {
// Paso 1: crear un nuevo nodo con el valor recibido
Nodo nodo = new nodo();
}
}Podemos mover nodo dentro de la clase ListaEnlazada y hacerla privada.
Nodo public void agregarAlFinal(int item) {
// Paso 1: crear un nuevo nodo con el valor recibido
var nodo = new nodo();
nodo.value = item;
}✅ Así podemos acceder a sus campos privados directamente desde la clase contenedora.
public class ListaEnlazada {
private class Nodo {
private int value;
private Nodo next;
public Nodo(int value) {
this.value = value;
}
}
.
.
.
}Creamos un constructor que garantice que cada nodo tenga un valor válido desde su creación.
public class ListaEnlazada {
private class Nodo {
private int value;
private Nodo next;
public Nodo(int value) {
this.value = value;
}
}
.
.
.
}Así evitamos tener nodos “vacíos”. Siempre que creemos un nodo, debe tener un valor asociado.
Ahora, implementemos la lógica completa de agregarAlFinal:
1️⃣ Si la lista está vacía → primero y ultimo apuntan al nuevo nodo.
2️⃣ Si no → conectamos el último nodo al nuevo y actualizamos ultimo.
➡️ null
primero → 🟨10
último → 🟦20
🟨 Lista actual antes de agregar un nuevo nodo.
primero → 🟨10
último → 🟦20
🟩 nuevo nodo (30)
📦 Se ha creado un nuevo nodo 30, aún no conectado.
ultimo.next = nodo➡️ null
primero → 🟨10
último → 🟦20 ➡️ 🟩30
📌 Ahora el último nodo (20) apunta hacia el nuevo nodo 30.
ultimo➡️ null
primero → 🟨10
último → 🟩30 ✅
🎯 ultimo ahora apunta correctamente al nuevo nodo 30. La lista está completamente enlazada.
➡️ null
primero → 🟨10
último → 🟩30 ✅
🧩 Resultado final: primero (10) → 20 → ultimo (30) → null La lista conserva su estructura perfecta.
public class Main {
public static void main(String[] args) {
var list = new ListaEnlazada();
list.agregarAlFinal(10);
list.agregarAlFinal(20);
list.agregarAlFinal(30);
}
}No tenemos aún un método print(), así que usaremos el depurador.
Agrega un punto de interrupción en la línea list.agregarAlFinal(30);
Ejecuta con Debug Main (Ctrl + D en Mac).
Usa el icono 🪄 “Step Over” para avanzar línea por línea.
list en el panel de variables.Verás algo así:
list
├── first → nodo(value=10)
│ └── next → nodo(value=20)
│ └── next → nodo(value=30)
└── last → nodo(value=30)
✅ Todo está correctamente enlazado. El último nodo apunta a null.
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 agregarAlFinal(int item) {
var nodo = new Nodo(item);
if (primero == null) {
primero = ultimo = nodo;
} else {
ultimo.next = nodo;
ultimo = nodo;
}
}
}