Microsoft pregunta: ¿Lista individual o lista doble? ¿Cuáles son los pros y los contras de usar cada uno?

Me hacen esa pregunta y tengo mis propios dichos, pero no estoy realmente seguro de qué decir sobre los pros y los contras. Microsoft hizo esta pregunta a uno de sus candidatos.

La lista enlazada individualmente le permite ir en una dirección. Mientras que la lista doblemente enlazada tiene una dirección bidireccional siguiente y anterior.

Aquí hay una buena imagen que dibuja las listas de enlaces simples y dobles.

enter image description here

Sin embargo, ¿cómo explica los pros y los contras de estos elementos de manera más ordenada?

preguntado el 22 de mayo de 12 a las 20:05

Uno es más flexible, el otro requiere más gastos generales. Además, sus listas enlazadas son realmente listas enlazadas circulares. -

Usé esas fotos para dar un aviso en realidad. -

6 Respuestas

Aunque esta pregunta ya ha sido respondida, de alguna manera no estoy satisfecho con la respuesta (sin intención de ofender), así que así es como respondería:

Qué usar: la lista de enlaces simples o dobles depende de lo que pretenda lograr y las limitaciones del sistema, si las hay.

Lista de enlaces simples:

Pros: simple en la implementación, requiere relativamente menos memoria para el almacenamiento, suponiendo que necesita eliminar/insertar (en) el siguiente nodo; la eliminación/inserción es más rápida.

Contras: no se puede iterar a la inversa, es necesario mantener un controlador para el nodo principal de la lista; de lo contrario, la lista se perderá en la memoria. Si está eliminando el nodo anterior o insertándolo en el nodo anterior, deberá recorrer la lista desde el encabezado hasta el nodo anterior para poder realizar esas operaciones: tiempo O (N).

--Entonces, esto debe usarse cuando tiene menos memoria y su objetivo principal es la inserción/eliminación y no la búsqueda de elementos.

Lista doblemente enlazada:

Pros: se puede iterar tanto en dirección directa como inversa. En caso de necesitar eliminar el nodo anterior, no es necesario atravesar desde el nodo principal, ya que el nodo que se eliminará se puede encontrar desde el puntero '.anterior'.

Contras: Relativamente complejo de implementar, requiere más memoria para el almacenamiento (1 puntero '.previous' por nodo). Las inserciones y eliminaciones consumen relativamente más tiempo (asignar/reasignar el puntero '.anterior' para los nodos vecinos)

--Esto debe usarse cuando no tiene limitaciones de memoria o las tiene mínimas, y su objetivo principal es buscar elementos.

Si hay más ventajas y desventajas para cualquiera, no dude en agregar, responder en los comentarios. ¡Gracias!

Respondido el 12 de Septiembre de 12 a las 13:09

Me hacen esa pregunta y tengo mis propios dichos, pero no estoy realmente seguro de qué decir sobre los pros y los contras.

Todo se reduce al uso. Hay una compensación aquí.

La lista de enlaces únicos es más simple en términos de implementación y, por lo general, tiene un requisito de memoria más pequeño, ya que solo necesita mantener la referencia del miembro directo en su lugar.

La lista doblemente enlazada tiene una iteración más eficiente, especialmente si necesita iterar en sentido inverso (lo que es terriblemente ineficiente con una sola lista enlazada), y una eliminación más eficiente de nodos específicos.

Dicho esto, dado que tiene este .NET etiquetado, las listas de doble enlace también tienen la ventaja de estar directamente en el marco en forma de LinkedList<T> clase. Esto proporciona una gran ventaja ya que no tiene que implementar, probar y mantener su propia clase de colección.

contestado el 22 de mayo de 12 a las 20:05

Mientras que la lista enlazada individualmente usa menos memoria por nodo (un puntero frente a dos punteros), su operación de eliminación es O(N) si todo lo que tiene es un puntero al nodo que desea eliminar, mientras que la eliminación doblemente vinculada es O(1). Hay un truco poco conocido que le permite eliminar de una lista de enlaces individuales en O(1), pero la lista debe ser circular para que funcione (mover el contenido de next en el actual, y eliminar next).

Las listas de enlaces dobles se pueden usar en lugares donde las listas de enlaces simples no funcionarían (una cola de dos extremos), pero requieren un poco más de "limpieza" y, como resultado, son un poco menos eficientes en las inserciones.

contestado el 22 de mayo de 12 a las 20:05

Ventaja de la lista doble enlazada: puede atravesar en ambas direcciones

Ventaja de la lista enlazada única: menos tareas domésticas para actualizar/insertar/eliminar, menos uso de memoria.

contestado el 22 de mayo de 12 a las 20:05

Bueno, depende de la situación. Si necesita poder obtener rápidamente tanto el elemento anterior como el siguiente de un elemento determinado, lo mejor es una lista doblemente enlazada.

Si solo necesita obtener el siguiente elemento de un elemento dado, entonces una lista con un solo enlace es lo suficientemente buena.

contestado el 22 de mayo de 12 a las 20:05

Lista de enlaces simples sobre lista de enlaces dobles:

Pros: 1. Menos requisitos de memoria.

  1. Solo necesita mantener el puntero/referencia hacia adelante en su lugar.
  2. La lista de enlaces simples es una estructura de datos persistente. http://en.wikipedia.org/wiki/Persistent_data_structure#Linked_lists

Contras: 1. En general, para eliminar un nodo de la lista, debe cambiar el siguiente puntero del nodo que aparece antes del nodo a eliminar para que ya no apunte al nodo a eliminar. En el caso de que tenga un puntero al nodo a eliminar. Debe comenzar desde el principio de la lista, iterarlo todo hasta que encuentre el nodo que viene justo antes del nodo que se eliminará. Esto lleva un tiempo O(n), por lo que el tiempo de ejecución para el paso de eliminación es O(n) en el peor de los casos.

  1. Proporciona acceso secuencial en una dirección. ¿Qué sucede si desea acceder en ambas direcciones, convirtiéndolo en una DLL?

Lista doblemente enlazada sobre la lista enlazada individualmente:

Pros: 1. Para eliminar un nodo cuando se da un puntero a ese nodo, la lista de doble enlace requiere O (1) en el peor de los casos.

  1. Proporciona acceso secuencial en ambas direcciones.

Contras: 1. Más requisitos de memoria (si no es una lista xored, una lista doblemente enlazada eficiente en memoria, lista enlazada XOR). Requiere dos punteros anterior y siguiente ya que es de dos vías.

  1. Necesita mantener los punteros hacia adelante y hacia atrás en su lugar.

  2. La lista de doble enlace no se adapta bien con una configuración persistente.

contestado el 01 de mayo de 20 a las 13:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.