Estructuras de datos · Listas enlazadas

Listas Enlazadas

Cómo conectar datos entre sí sin necesitar un bloque continuo de memoria.

Simple Doble Circular
→← usa las flechas, o desliza para avanzar
Motivación

El problema de los arrays

Un array reserva un bloque fijo y continuo de memoria. Si se llena, o si necesitas insertar algo en el medio, es costoso: hay que mover todo lo que está después.

Array

Tamaño fijo desde el inicio. Insertar en el medio implica correr todos los elementos siguientes un lugar.

Lista enlazada

Crece de a un elemento. Insertar es solo cambiar a qué apunta un puntero, sin mover nada más.

Idea base

La pieza básica: el nodo

Cada nodo guarda dos cosas: un dato y una referencia (puntero) al siguiente nodo.

dato
siguiente →
los nodos no están pegados en memoria: se conectan solo por sus punteros
Lista simple

Nodos conectados en una sola dirección

Cada nodo apunta solo al siguiente. El último apunta a NULL: ahí termina la lista.

cabeza (head)
A
→
B
→
C
→ NULL
Lista simple · Operaciones

Insertar y eliminar

INSERTAR AL INICIO

antes
B
→
C
→NULL
después
A
→
B
→
C
→NULL

el nuevo nodo pasa a ser la cabeza

INSERTAR AL FINAL

antes
A
→
B
→NULL
después
A
→
B
→
C
→NULL

se recorre hasta el último y se conecta ahí

ELIMINAR (nodo B)

antes
A
→
B
→
C
→NULL
después
A
→
C
→NULL

A ahora apunta directo a C

Lista simple · Recorrido

Recorrer la lista

Se empieza en la cabeza y se avanza nodo por nodo hasta llegar a NULL.

PasoPuntero actual
actual = headapunta a A imprime A
actual = actual.siguienteapunta a B imprime B
actual = actual.siguienteapunta a C imprime C
actual = actual.siguienteapunta a NULL → se detiene
Lista doble

Nodos conectados en ambas direcciones

Cada nodo guarda dos punteros: uno al siguiente y otro al anterior. Se puede recorrer para adelante o para atrás.

← anterior
dato
siguiente →
cabeza (head)
NULL⇄
A
⇄
B
⇄
C
⇄NULL
Lista doble · Ventaja

Ir hacia atrás sin volver a empezar

En una lista simple, para ir "atrás" hay que recorrer todo desde el inicio. En una lista doble, el nodo ya sabe quién es su anterior.

Ejemplo cotidiano

El botón "anterior" en un carrusel de fotos, o navegar atrás y adelante en un editor de texto.

Eliminar es más simple

El nodo a borrar ya conoce a su anterior y a su siguiente: solo hay que reconectarlos entre sí.

Lista circular

El último nodo apunta al primero

No hay NULL al final: la lista se cierra en un círculo. Sirve para turnos que se repiten, como el reparto round-robin.

A
B
C
D
Comparación

Array vs. lista enlazada

ArrayLista enlazada
TamañoFijo desde el inicioCrece de a un nodo
Acceder a un elementoDirecto, por posiciónHay que recorrer desde el inicio
Insertar en el medioMueve todo lo siguienteSolo cambia un puntero
MemoriaUn bloque continuoNodos sueltos, conectados por punteros
Resumen

Para recordar

01

Simple: cada nodo apunta solo al siguiente. El último apunta a NULL.

02

Doble: cada nodo apunta al siguiente y al anterior. Se recorre en ambos sentidos.

03

Circular: el último nodo apunta de vuelta al primero. No hay NULL.

04

Dato curioso: una cola FIFO se puede construir con una lista enlazada, encolando al final y desencolando desde la cabeza.