Publicado en Tema 8 • Ejercicios

Ejercicio 2: Listas enlazadas (LinkedList)

Enunciado

En este ejercicio exploraremos la clase LinkedList y cómo interactúa con otras implementaciones de la interfaz List. El objetivo es aprender a migrar datos entre colecciones y manipular el orden de los elementos.

Requisitos:

  • Reutilización: Partir de la lista de personas creada en el ejercicio anterior (ArrayList).
  • Conversión: Copiar todos los elementos de la lista original a una nueva instancia de la clase LinkedList.
  • Manipulación: Intercambiar los objetos de la primera y la última posición de la lista enlazada.

A diferencia del ArrayList, una LinkedList almacena sus elementos como nodos conectados entre sí, lo que facilita ciertas operaciones de inserción y borrado.

Solución

Para esta solución, utilizamos el constructor de LinkedList que acepta otra colección como argumento y la clase de utilidad Collections para realizar el intercambio (swap) de forma eficiente.

package Tema8.Ejercicios.ejercicio2;

import Tema8.Ejercicios.ejercicio1.Persona;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

public class Ejercicio2 {
    public static void main(String[] args) {
        // 1. Reutilizamos la lógica del ejercicio anterior creando la lista base
        List<Persona> listaEjercicio1 = new ArrayList<>();
        listaEjercicio1.add(new Persona("Ana", 25));
        listaEjercicio1.add(new Persona("David", 20));
        listaEjercicio1.add(new Persona("Juan", 34));

        System.out.println("Lista original (ArrayList): " + listaEjercicio1);

        // 2. Copiamos los elementos a una nueva LinkedList
        // El constructor de LinkedList puede recibir cualquier Collection
        List<Persona> listaEjercicio2 = new LinkedList<>(listaEjercicio1);
        System.out.println("Nueva lista (LinkedList): " + listaEjercicio2);

        // 3. Intercambiamos la primera y la última posición
        // Usamos Collections.swap(lista, indice1, indice2)
        Collections.swap(listaEjercicio2, 0, listaEjercicio2.size() - 1);
        
        System.out.println("Lista tras el intercambio: " + listaEjercicio2);
    }
}

Diferencias clave: ArrayList vs LinkedList

Aunque ambas implementan la interfaz List y se usan de forma casi idéntica, sus diferencias internas son importantes:

  • ArrayList: Es mejor para acceder a elementos rápidamente mediante un índice (acceso aleatorio).
  • LinkedList: Es más eficiente para insertar o eliminar elementos al principio o al final de la lista, ya que no necesita desplazar el resto de elementos en memoria.
  • Collections.swap: Es un método genérico que funciona con cualquier tipo de lista, ocultando la complejidad del intercambio manual.