¿Puedes pensar en dos situaciones en las que usarías listas vinculadas?

Las listas vinculadas son excelentes cuando necesita insertar un elemento o eliminar un elemento del medio de una colección ordenada en tiempo constante. Una matriz / vector requeriría que “desplazaras” cada elemento después del elemento que eliminaste una posición, lo que sería lento y horrible si la colección fuera grande. Por el contrario, eliminar un elemento de una lista vinculada solo implica reescribir algunos punteros, lo que es prácticamente instantáneo.

Un ejemplo podría ser una aplicación que lee múltiples registros ordenados de un archivo o base de datos y luego los muestra al usuario en una lista editable. El usuario desliza un elemento para eliminarlo; La estructura de datos subyacente en la memoria es una lista vinculada, y el nodo que representa el elemento se elimina de ella.

Incluso si hubiera un millón de entradas, el elemento se eliminaría al instante. Pero, si los millones de elementos se mantuvieron en una matriz / vector, por otro lado, la aplicación podría parecer que se bloquea por un momento ya que todos los elementos después del que el usuario eliminó se copiaron hacia arriba para llenar el vacío.

También se pueden unir dos listas vinculadas, de nuevo, casi al instante. Esto es mucho más rápido que copiar elementos uno por uno de una colección a otra.

Al igual que hay ventajas, también hay desventajas. Las listas vinculadas generan una sobrecarga de memoria alta. Volviendo al ejemplo que di, esos millones de elementos en la lista consumirían mucha más memoria que si estuvieran almacenados consecutivamente, o incluso si estuvieran almacenados como una matriz de punteros a objetos.

Si hubiéramos usado una lista doblemente vinculada, eso habría significado 2 o 3 punteros para cada elemento (anterior, siguiente y opcionalmente el objeto al que hace referencia el nodo), que en un sistema de 64 bits consumiría 16-24 bytes adicionales. por elemento en comparación con una secuencia de objetos almacenada de forma contigua (no en una lista vinculada). Para un millón de entradas, eso es 16 a 24 millones de bytes adicionales que necesitaría nuestro programa.

Una implementación simple de una lista vinculada también podría ralentizar nuestra aplicación porque habría tantos objetos asignados en el montón, incluidos los nodos dentro de la propia lista vinculada.

Finalmente, las listas vinculadas no son excelentes cuando se trata de buscar cosas dentro de la lista. Tienes que hacer un escaneo de fuerza bruta a través de cada elemento de la lista para encontrar lo que buscas.

Un buen ejemplo serían los editores de texto (al menos los de antaño).

Tiene un cursor y puede moverlo hacia adelante y hacia atrás, una vez que usa la tecla de retroceso o elimina, elimina exactamente un carácter en el cursor. Para que esto sea eficiente, necesita eliminar para trabajar rápido. La eliminación de un nodo (char) se realiza en tiempo constante.

Del mismo modo, al insertar texto (escribir), la adición de un nodo se realiza en tiempo constante.

Otro sería implementar el popular juego de la serpiente: a medida que la serpiente se mueve, agrega un bloque al frente (nariz) y elimina un bloque de la parte posterior (cola). Es por eso que las colas a menudo se implementan con listas vinculadas.

Sin embargo, antes de usar listas vinculadas, considere este artículo

https://www.linkedin.com/pulse/p

Compare con la lista respaldada por una matriz, la lista vinculada tiene la ventaja de mover la sublista en tiempo constante. Por ejemplo, cortar una palabra en una oración y luego pegarla al final requeriría mover cualquier palabra en el medio a la puerta principal luau respaldada por una matriz. Para la lista vinculada, es solo un intercambio de puntero.

Aunque la lista está respaldada, pero la matriz podría reducir la complejidad de amortizaciones al agregar un elemento que supere el tamaño de la matriz al asignar el doble del tamaño. La lista vinculada posiblemente podría reducir el potencial 50% de pérdida de memoria si los datos se almacenan en la memoria asignada en el nodo. Pero no hay forma de ir más allá de la complejidad del espacio O (n). Es solo un mejor peor de los casos.

La lista vinculada se usa en las siguientes situaciones.

  • Cuando no sabe la cantidad de objetos que necesita para su programa, pero sabe que necesita más de uno.
  • En problemas de gráficos en los que implementa utilizando listas de adyacencia.

Algunas implementaciones de List proporcionan una LinkedList … Al igual que Java LinkedList … y en el aprendizaje de estructuras de datos autorreferenciales en C, la codificación de LinkedLists también es bastante común …