Java LinkedList: Guía Completa con Ejemplos
Java LinkedList
Descubre cómo aprovechar LinkedList de Java para manipulación eficiente de datos, con ejemplos de código prácticos y mejores prácticas.
La clase LinkedList en el Framework de Colecciones de Java implementa una lista doblemente enlazada. Cada elemento, o nodo, contiene tres campos:
- prev – referencia al nodo anterior (null para el primer elemento)
- next – referencia al siguiente nodo (null para el último elemento)
- data – el valor real almacenado en el nodo
Creando un LinkedList en Java
Instancia un LinkedList con un tipo de elemento específico:
LinkedList<Tipo> lista = new LinkedList<>();
Ejemplos:
// Lista de enteros
LinkedList<Integer> numeros = new LinkedList<>();
// Lista de cadenas
LinkedList<String> palabras = new LinkedList<>();
Ejemplo: Crear LinkedList en Java
import java.util.LinkedList;
class Main {
public static void main(String[] args){
LinkedList<String> animales = new LinkedList<>();
animales.add("Perro");
animales.add("Gato");
animales.add("Vaca");
System.out.println("LinkedList: " + animales);
}
}
Salida
LinkedList: [Perro, Gato, Vaca]
Este código demuestra un LinkedList básico llamado animales poblado con tres elementos vía add().
Cómo Funciona un LinkedList en Java
A diferencia de los arrays, los nodos están dispersos en memoria y enlazados entre sí. El diagrama siguiente ilustra tres nodos y sus conexiones.

- Perro – primer nodo, prev = null, next = Gato
- Gato – nodo medio, prev = Perro, next = Vaca
- Vaca – último nodo, prev = Gato, next = null
Para más detalles, consulta el artículo Linked List.
Métodos Clave de LinkedList
A continuación se muestran las operaciones más usadas:
- Añadir elementos
- Acceder a elementos
- Actualizar elementos
- Eliminar elementos
1. Añadiendo Elementos
Usa add() para añadir un nodo, opcionalmente especificando un índice:
import java.util.LinkedList;
class Main {
public static void main(String[] args){
LinkedList<String> animales = new LinkedList<>();
animales.add("Perro");
animales.add("Gato");
animales.add("Vaca");
System.out.println("LinkedList: " + animales);
animales.add(1, "Caballo");
System.out.println("LinkedList Actualizado: " + animales);
}
}
Salida
LinkedList: [Perro, Gato, Vaca] LinkedList Actualizado: [Perro, Caballo, Gato, Vaca]
El segundo add() inserta "Caballo" en el índice 1, desplazando los elementos subsiguientes.
2. Accediendo a Elementos
Recupera un elemento por índice con get():
import java.util.LinkedList;
class Main {
public static void main(String[] args){
LinkedList<String> lenguajes = new LinkedList<>();
lenguajes.add("Python");
lenguajes.add("Java");
lenguajes.add("JavaScript");
System.out.println("LinkedList: " + lenguajes);
String str = lenguajes.get(1);
System.out.print("Elemento en índice 1: " + str);
}
}
Salida
LinkedList: [Python, Java, JavaScript] Elemento en índice 1: Java
La iteración también puede realizarse vía iterator() o listIterator() para recorrido avanzado.
3. Actualizando Elementos
Reemplaza un elemento en un índice específico usando set():
import java.util.LinkedList;
class Main {
public static void main(String[] args){
LinkedList<String> lenguajes = new LinkedList<>();
lenguajes.add("Java");
lenguajes.add("Python");
lenguajes.add("JavaScript");
lenguajes.add("Java");
System.out.println("LinkedList: " + lenguajes);
lenguajes.set(3, "Kotlin");
System.out.println("LinkedList Actualizado: " + lenguajes);
}
}
Salida
LinkedList: [Java, Python, JavaScript, Java] LinkedList Actualizado: [Java, Python, JavaScript, Kotlin]
4. Eliminando Elementos
Elimina un elemento por índice con remove():
import java.util.LinkedList;
class Main {
public static void main(String[] args){
LinkedList<String> lenguajes = new LinkedList<>();
lenguajes.add("Java");
lenguajes.add("Python");
lenguajes.add("JavaScript");
lenguajes.add("Kotlin");
System.out.println("LinkedList: " + lenguajes);
String eliminado = lenguajes.remove(1);
System.out.println("Elemento Eliminado: " + eliminado);
System.out.println("LinkedList Actualizado: " + lenguajes);
}
}
Salida
LinkedList: [Java, Python, JavaScript, Kotlin] Elemento Eliminado: Python Nuevo LinkedList: [Java, JavaScript, Kotlin]
Otros Métodos Útiles
| Método | Descripción |
|---|---|
contains() | Verifica si existe un valor |
indexOf() | Índice de la primera ocurrencia |
lastIndexOf() | Índice de la última ocurrencia |
clear() | Elimina todos los elementos |
iterator() | Proporciona un Iterator |
LinkedList como Queue y Deque
Como LinkedList implementa Queue y Deque, soporta operaciones FIFO y LIFO. Métodos comunes incluyen:
| Método | Descripción |
|---|---|
addFirst() | Añadir al principio |
addLast() | Añadir al final |
getFirst() | Ver primero |
getLast() | Ver último |
removeFirst() | Eliminar primero |
removeLast() | Eliminar último |
peek() | Ver cabeza sin eliminar |
poll() | Recuperar y eliminar cabeza |
offer() | Encolar al final |
Ejemplo: LinkedList como Queue
import java.util.LinkedList;
import java.util.Queue;
class Main {
public static void main(String[] args){
Queue<String> lenguajes = new LinkedList<>();
lenguajes.add("Python");
lenguajes.add("Java");
lenguajes.add("C");
System.out.println("LinkedList: " + lenguajes);
String primero = lenguajes.peek();
System.out.println("Elemento Accedido: " + primero);
String eliminado = lenguajes.poll();
System.out.println("Elemento Eliminado: " + eliminado);
System.out.println("LinkedList después de poll(): " + lenguajes);
lenguajes.offer("Swift");
System.out.println("LinkedList después de offer(): " + lenguajes);
}
}
Salida
LinkedList: [Python, Java, C] Elemento Accedido: Python Elemento Eliminado: Python LinkedList después de poll(): [Java, C] LinkedList después de offer(): [Java, C, Swift]
Ejemplo: LinkedList como Deque
import java.util.LinkedList;
import java.util.Deque;
class Main {
public static void main(String[] args){
Deque<String> animales = new LinkedList<>();
animales.add("Vaca");
System.out.println("LinkedList: " + animales);
animales.addFirst("Perro");
System.out.println("LinkedList después de addFirst(): " + animales);
animales.addLast("Cebra");
System.out.println("LinkedList después de addLast(): " + animales);
animales.removeFirst();
System.out.println("LinkedList después de removeFirst(): " + animales);
animales.removeLast();
System.out.println("LinkedList después de removeLast(): " + animales);
}
}
Salida
LinkedList: [Vaca] LinkedList después de addFirst(): [Perro, Vaca] LinkedList después de addLast(): [Perro, Vaca, Cebra] LinkedList después de removeFirst(): [Vaca, Cebra] LinkedList después de removeLast(): [Vaca]
Iterando a Través de un LinkedList
El bucle for-each mejorado ofrece una forma concisa de recorrer elementos:
import java.util.LinkedList;
class Main {
public static void main(String[] args){
LinkedList<String> animales = new LinkedList<>();
animales.add("Vaca");
animales.add("Gato");
animales.add("Perro");
System.out.println("LinkedList: " + animales);
System.out.println("Accediendo a elementos de la lista enlazada:");
for(String animal: animales){
System.out.print(animal + ", ");
}
}
}
Salida
LinkedList: [Vaca, Gato, Perro] Accediendo a elementos de la lista enlazada: Vaca, Gato, Perro,
LinkedList vs. ArrayList
Ambas clases implementan List, pero difieren en características de rendimiento:
| LinkedList | ArrayList |
|---|---|
Implementa List, Queue, Deque | Implementa List |
| Nodo almacena prev, data, next | Un elemento por posición del array |
| Estructura doblemente enlazada | Array redimensionable |
| Inserciones/eliminaciones son O(1) cuando se conoce la posición | Inserciones tras un índice requieren desplazamiento O(n) |
| Acceso aleatorio requiere recorrido O(n) | Acceso directo por índice O(1) |
Nota: Puedes instanciar un LinkedList a través de cualquiera de sus interfaces:
// vía List
List<String> animales1 = new LinkedList<>();
// vía Queue
Queue<String> animales2 = new LinkedList<>();
// vía Deque
Deque<String> animales3 = new LinkedList<>();
Cuando usas una referencia de interfaz, solo están disponibles los métodos definidos por esa interfaz.
Java
- Dominar Operadores en Java: Tipos, Sintaxis y Ejemplos Prácticos
- Comentarios en Java: Tipos, Uso y Mejores Prácticas
- Dominar el Bucle for Mejorado en Java: Sintaxis, Ejemplos y Mejores Prácticas
- Dominar Strings en Java: Creación, Métodos y Mejores Prácticas
- Dominando interfaces en Java: Conceptos, implementación y mejores prácticas
- Dominando las clases internas anónimas en Java: Definición, sintaxis y ejemplos prácticos
- Dominando Try‑with‑Resources en Java: Gestión automática de recursos explicada
- Anotaciones en Java explicadas: Tipos, ubicación y ejemplos prácticos
- Aserciones en Java: Guía práctica para detectar bugs y asegurar fiabilidad del código
- Entendiendo Java Vector: Uso, Características y Comparación con ArrayList
- Java 8: Guía de Referencia Rápida Completa