¿Cómo implementaría una lista vinculada bidireccional en Rust?

Tenga en cuenta que esta pregunta se refiere a una versión de Rust antes de Rust 1.0. Aunque la sintaxis ha cambiado, los conceptos siguen siendo válidos.

Puede implementar fácilmente una lista vinculada solo hacia adelante utilizando punteros propios, algo como:

struct Node<T> {
  next: Option<~Node<T>>,
  data: T
}

Imagine, sin embargo, si desea implementar eficientemente una cola que admita cuatro operaciones básicas:

push: agregar al final de la listapop: eliminar y volver al final de la listaunshift: agregar al principio de la listashift: eliminar y volver al final de la lista

En un lenguaje con punteros normales, puede implementar esto con una lista vinculada bidireccional y un objeto raíz que almacenefirst ylast punteros al primer y último elemento de la lista.

No puedo ver cómo implementaría esto en Rust.

Puedo adivinar vagamente que usarías un montón de referencias, y tal vez algo como:

struct Node<T> {
  next: Option<&Node<T>>,
  prev: Option<&Node<T>>,
  data: T
}

... pero no puedo ver cómo gestionarías el alcance de estas variables durante toda la vida.

¿Alguien puede señalarme en la dirección de esto, o un ejemplo similar que involucra vidas complejas con referencias entre objetos?

(Otro ejemplo típico de este estilo de código sería el patrón de observación donde muchos objetos deben publicar actualizaciones de eventos en una sola ubicación, por ejemplo.UINode <> ----EventObserver <> ----EventCore <> ----UINodes; múltiples objetos en una jerarquía compleja que comparten punteros, donde los eventos se propagan desde los nodos hoja hasta algún núcleo y luego se envían a diferentes nodos hoja)

Respuestas a la pregunta(3)

Su respuesta a la pregunta