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.