Nodos
Cada elemento es un nodo con dos partes: el dato y la referencia al siguiente nodo.
Representación en memoria, listas con cabecera y listas dobles
Cada elemento es un nodo con dos partes: el dato y la referencia al siguiente nodo.
La lista se conoce por su primer nodo, la cabeza. El último apunta a None.
Crece y se reduce en tiempo de ejecución; no hay que reservar un tamaño fijo.
| Dirección | Dato | Siguiente |
|---|---|---|
| 0x1A0 | 12 | 0x3F8 |
| 0x1B8 | ocupado | otro programa |
| 0x2C4 | 41 | None |
| 0x310 | libre | |
| 0x3F8 | 27 | 0x2C4 |
Cada nodo se crea donde el sistema encuentre espacio libre. Para recorrer la lista se empieza en la cabeza y se sigue el campo siguiente hasta llegar a None.
Un nodo especial al inicio que no guarda un dato de la lista. Puede guardar información como el número de nodos.
Insertar o eliminar al inicio es igual que en medio: siempre hay un nodo anterior y no hay que cambiar la cabeza.
Nunca es None: es la cabecera sola, con siguiente igual a None. Así se evitan casos especiales en el código.
El último nodo no apunta a None: regresa a la cabecera.
El recorrido termina cuando se vuelve a llegar a la cabecera, que funciona como centinela.
Sirve para procesos que dan vueltas, como turnos o una lista de reproducción.
Se avanza con siguiente desde la cabeza y se regresa con anterior desde la cola.
nuevo.ant = A, nuevo.sig = B, A.sig = nuevo y B.ant = nuevo. Son cuatro enlaces.
X.ant.sig = X.sig y X.sig.ant = X.ant. No hace falta buscar el nodo anterior.
class Nodo: def __init__(self, dato): self.dato = dato self.ant = None self.sig = None class ListaDoble: def __init__(self): self.cabeza = None self.cola = None
def agregar_final(self, dato): nuevo = Nodo(dato) if self.cabeza is None: self.cabeza = self.cola = nuevo else: nuevo.ant = self.cola self.cola.sig = nuevo self.cola = nuevo def recorrer_inverso(self): actual = self.cola while actual: print(actual.dato) actual = actual.ant
| Arreglo | Lista simple | Lista con cabecera | Lista doble | |
|---|---|---|---|---|
| Enlaces por nodo | 0 | 1 | 1 y un nodo extra | 2 |
| Acceso al elemento i | O(1) | O(n) | O(n) | O(n) |
| Insertar al inicio | O(n) | O(1) | O(1) sin caso especial | O(1) |
| Eliminar un nodo conocido | O(n) | O(n), busca el anterior | O(n), busca el anterior | O(1) |
| Recorrido | Ambos sentidos | Solo adelante | Solo adelante | Ambos sentidos |
| Uso típico | Tablas fijas | Pilas y colas | Listas que cambian al inicio | Historial adelante y atrás |
Cormen, T. H., Leiserson, C. E., Rivest, R. L. y Stein, C. (2022). Introduction to algorithms (4.a ed.). MIT Press.
Goodrich, M. T., Tamassia, R. y Goldwasser, M. H. (2013). Data structures and algorithms in Python. Wiley.
Joyanes Aguilar, L. y Zahonero Martínez, I. (2008). Estructuras de datos en Java. McGraw-Hill.
Python Software Foundation. (2026). Documentación de Python 3. https://docs.python.org/es/3/