Domina la construcción de una doubly linked list: una estructura con recorrido bidireccional que usa punteros next y preview para moverse de la head a la tail y viceversa. Verás cómo su nodo incluye tres campos y cómo adaptar el método append para enlazar en dos direcciones con una sola línea clave.
¿Qué es una doubly linked list y por qué usarla?
Una doubly linked list es una linked list con enlaces hacia adelante y hacia atrás. A diferencia de una singly, no necesitas “volver a empezar” desde la cabeza para regresar; puedes ir de la tail a la head directamente. Esto puede hacer ciertas búsquedas y recorridos más ágiles en casos particulares.
¿Qué ventajas ofrece frente a una singly linked list?
Recorrido en dos direcciones: head → tail y tail → head.
Evita rehacer bucles desde el inicio al retroceder.
Misma regla de acceso: no hay índice aleatorio, se recorre nodo a nodo.
¿Cómo se recorre sin volver al inicio?
Avanza con next hasta la tail.
Retrocede con preview hasta la head.
Mantiene la lógica de lista enlazada: pasos secuenciales, sin acceso por índice directo.
¿Cómo se define la estructura: nodo, instancia y memoria?
El corazón de la lista es el nodo. Aquí cambia respecto a una singly: además de value y next, se agrega un puntero preview (al previo), que inicia en null.
¿Qué contiene el nodo de una doubly linked list?
value: el dato que guarda el nodo.
next: referencia al siguiente nodo.
preview: referencia al nodo anterior; inicia en null.
¿Cómo se inicializa la primera instancia de la clase?
Crear el primer nodo con value y next = null.
Definir preview = null en ese primer nodo.
Asignar head = tail = primerNodo.
Iniciar length = 1 porque ya existe un elemento.
Representación mental en memoria:
Los nodos forman una cadena con dos direcciones.
Puedes “saltar” hacia atrás gracias a preview sin reiniciar desde la head.
¿Cómo programar append y qué reto sigue?
El método append añade un nodo al final y ahora debe enlazar en ambos sentidos. El ajuste clave es establecer el preview del nuevo nodo apuntando a la tail actual, luego encadenar el next y actualizar la tail.
¿Cómo cambia el método append?
Crear el nuevo nodo.
Apuntar su preview a la tail actual.
Conectar la tail actual hacia adelante con next.
Mover tail al nuevo nodo e incrementar length.
Fragmento esencial del enlace doble:
append(value){const newNode =newNode(value); newNode.preview=this.tail;// enlace hacia atrásthis.tail.next= newNode;// enlace hacia adelantethis.tail= newNode;// actualizar colathis.length++;returnthis;}
Resultados esperados tras varios append:
La head conserva preview = null.
La tail conserva next = null.
Los nodos intermedios tienen next y preview correctamente enlazados.
¿Qué métodos debes extender después?
Implementa la misma lógica de doble enlace en insert.
Ajusta referencias en remove para ambos lados.
Revisa métodos previos de la singly y añade preview donde corresponda.
Sigue la recomendación: antes de codear, toma papel y lápiz para planear los enlaces. ¿Ya adaptaste tus métodos con el nuevo puntero? Comparte tu solución y cuéntanos cómo lo resolviste.