Listas Enlazadas — Método agregarAlFinal

💡 Comencemos con el método agregarAlFinal()

Bien, comencemos implementando el método agregarAlFinal.

public void agregarAlFinal(int item) {
    // Paso 1: crear un nuevo nodo con el valor recibido

}

💡 Comencemos con el método 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.

💡 Comencemos con el método 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.

💡 Comencemos con el método 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.

Clase interna Nodo

public class Nodo {
    private int valor;
    private Nodo siguiente;
    
    public void setValue(int value) {
    this.value=value;
    }
}

Problema con los atributos privados

En lugar de usar un setter, observemos algo:

La clase nodo forma parte de la implementación interna de nuestra lista enlazada.

Por lo tanto, no necesitamos exponerla fuera de la clase ListaEnlazada.

Clase interna Nodo

En lugar de usar un setter:

public class Nodo {
    private int valor;
    private Nodo siguiente;
    
    public void setValue(int value) {
    this.value=value;
    }
}

🧩 Clase interna nodo

public 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.

🧩 Clase interna 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.

🧱 Constructor personalizado

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.

🧱 Constructor personalizado

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.

🧠 Lógica principal del método

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.

Antes de insertar

10
➡️
20

➡️ null

primero → 🟨10
        último → 🟦20

🟨 Lista actual antes de agregar un nuevo nodo.

Crear nuevo nodo

10
➡️
20
➡️ null     
30

primero → 🟨10
        último → 🟦20
        🟩 nuevo nodo (30)

📦 Se ha creado un nuevo nodo 30, aún no conectado.

Conexión ultimo.next = nodo

10
➡️
20
➡️
30

➡️ null

primero → 🟨10
        último → 🟦20 ➡️ 🟩30

📌 Ahora el último nodo (20) apunta hacia el nuevo nodo 30.

Actualizamos ultimo

10
➡️
20
➡️
30

➡️ null

primero → 🟨10
        último → 🟩30 ✅

🎯 ultimo ahora apunta correctamente al nuevo nodo 30. La lista está completamente enlazada.

🧩 Visualización final

10
➡️
20
➡️
30

➡️ null

primero → 🟨10
        último → 🟩30 ✅

🧩 Resultado final: primero (10)20ultimo (30) → null La lista conserva su estructura perfecta.

🧠 Lógica principal del método

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;
        }
    }

🧪 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);
    }
}

No tenemos aún un método print(), así que usaremos el depurador.

🔍 Inspección en 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.

  • Expande 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;
        }
    }

}