Saltar al contenido

La lista doble

En una lista simple, borrar el último nodo obliga a recorrer: para mover la cola hay que encontrar el penúltimo, y nada apunta hacia atrás.

Una lista doble guarda en cada nodo dos enlaces: siguiente y anterior. Con eso:

  • borrar el último es O(1): la cola nueva es cola.anterior;
  • borrar un nodo que ya tienes es O(1): sus vecinos se enlazan entre sí;
  • recorrer hacia atrás es posible.

El precio: cada nodo gasta un enlace más, y cada operación tiene que mantener los dos sentidos.

Texto
función quitar(lista, n):         # lista doble con centinela    n.anterior.siguiente ← n.siguiente    n.siguiente.anterior ← n.anterior

En la figura, quitar aplicado al último nodo de una lista doble con centinela, en dos pasos.

Quitar el último nodo de una lista doble con centinelaLista doble circular con un centinela y los valores 12, 7 y 31. Cada nodo tiene tres campos: anterior, valor y siguiente. Paso 1: la lista de partida; el siguiente del 31 apunta al centinela y el anterior del centinela apunta al 31. Paso 2: se quita el 31. El siguiente del 7 pasa a apuntar al centinela (enlace 1, trazo grueso) y el anterior del centinela pasa a apuntar al 7 (enlace 2, trazo grueso). El 31, atenuado, queda fuera de la lista.Paso 1 de 2: lista de partida. La cola es centinela.anterior, el 31—12731centinelaPaso 2 de 2: quitar(31). Dos enlaces nuevos, 1 y 2, y el 31 queda fuera—127311: el 7 apunta al centinela2: el centinela apunta atrás al 7centinelaquitado
Quitar un nodo que ya tienes son dos enlaces, sin recorrer nada y sin casos especiales. Trazo grueso: los enlaces nuevos; atenuado: el nodo quitado.

Con un centinela que cierra el círculo (su anterior es el último y su siguiente es el primero), quitar no tiene ningún caso especial.

Su fila en la tabla de costos

La cola cambia la columna de insertar al final, y la lista doble cambia la de borrar al final:

Representación leer(i) insertar o borrar al inicio insertar al final borrar al final insertar o borrar en i
lista simple con cabeza y cola O(i) O(1) O(1) O(n) O(i) para llegar, O(1) para enlazar
lista doble con centinela O(min(i, n − i)), desde el extremo más cercano O(1) O(1) O(1) llegar, más O(1)

Lee el recorrido de esta página. Al pasar al siguiente momento, este cuenta como leído.