doubly linked list data structure c with illustration
Un tutorial detallado sobre una lista doblemente enlazada.
Una lista doblemente enlazada es una variación de la lista enlazada individualmente. Somos conscientes de que la lista enlazada individualmente es una colección de nodos y cada nodo tiene una parte de datos y un puntero apuntando al siguiente nodo.
Una lista doblemente enlazada es también una colección de nodos. Cada nodo aquí consta de una parte de datos y dos punteros. Un puntero apunta al nodo anterior mientras que el segundo apunta al siguiente nodo.
=> Consulte los tutoriales de capacitación detallados de C ++ aquí.
Lo que vas a aprender:
Doblemente enlazado en C ++
Como en la lista enlazada individualmente, la lista enlazada doble también tiene una cabeza y una cola. El puntero anterior de la cabeza se establece en NULL ya que este es el primer nodo. El siguiente puntero del nodo de cola se establece en NULL ya que este es el último nodo.
En el siguiente diagrama se muestra un diseño básico de la lista doblemente enlazada.
En la figura anterior, vemos que cada nodo tiene dos punteros, uno apunta al nodo anterior y el otro apunta al siguiente nodo. Solo el primer nodo (cabeza) tiene su nodo anterior establecido en nulo y el último nodo (cola) tiene su siguiente puntero establecido en nulo.
Como la lista doblemente vinculada contiene dos punteros, es decir, anterior y siguiente, podemos recorrerla en las direcciones hacia adelante y hacia atrás. Ésta es la principal ventaja de la lista de enlaces dobles sobre la lista de enlaces individuales.
cuál es el mejor software de eliminación de malware
Declaración
En la declaración de estilo C, un nodo de la lista doblemente enlazada se representa de la siguiente manera:
|_+_|Aparte de la declaración anterior, también podemos representar un nodo en la lista doblemente enlazada como una clase en C ++. Una lista doblemente enlazada se representa como una clase cuando usamos STL en C ++. También podemos implementar una lista doblemente enlazada usando una clase en Java.
Operaciones básicas
A continuación se muestran algunas de las operaciones que podemos realizar en una lista doblemente enlazada.
Inserción
La operación de inserción de la lista doblemente vinculada inserta un nuevo nodo en la lista vinculada. Dependiendo de la posición donde se inserte el nuevo nodo, podemos tener las siguientes operaciones de inserción.
- Inserción en la parte delantera - Inserta un nuevo nodo como primer nodo.
- Inserción al final - Inserta un nuevo nodo al final como último nodo.
- Inserción antes de un nodo - Dado un nodo, inserta un nuevo nodo antes de este nodo.
- Inserción después de un nodo - Dado un nodo, inserta un nuevo nodo después de este nodo.
Supresión
La operación de eliminación elimina un nodo de una posición determinada en la lista doblemente vinculada.
- Eliminación del primer nodo - Elimina el primer nodo de la lista.
- Eliminación del último nodo - Elimina el último nodo de la lista.
- Eliminación de un nodo dados los datos - Dados los datos, la operación hace coincidir los datos con los datos del nodo en la lista vinculada y elimina ese nodo.
El recorrido
El recorrido es una técnica de visitar cada nodo en la lista vinculada. En una lista doblemente enlazada, tenemos dos tipos de recorridos ya que tenemos dos punteros con diferentes direcciones en la lista doblemente enlazada.
- Recorrido hacia adelante - El recorrido se realiza utilizando el siguiente puntero que está en la dirección de avance.
- Recorrido hacia atrás - El recorrido se realiza utilizando el puntero anterior, que es la dirección hacia atrás.
Contrarrestar
Esta operación invierte los nodos en la lista doblemente enlazada de modo que el primer nodo se convierte en el último nodo mientras que el último nodo se convierte en el primer nodo.
Buscar
La operación de búsqueda en la lista doblemente enlazada se utiliza para buscar un nodo particular en la lista enlazada. Para este propósito, necesitamos recorrer la lista hasta que se encuentren datos coincidentes.
Inserción
Insertar un nodo en la parte delantera
La inserción de un nuevo nodo al principio de la lista se muestra arriba. Como se ve, el nuevo nodo N anterior se establece en nulo. La cabeza apunta al nuevo nodo. El siguiente puntero de N ahora apunta a N1 y el anterior de N1 que antes apuntaba a Null ahora apunta a N.
Insertar nodo al final
La inserción del nodo al final de la lista doblemente enlazada se logra apuntando el siguiente puntero del nuevo nodo N a nulo. El puntero anterior de N apunta a N5. El puntero 'Siguiente' de N5 apunta a N.
Insertar nodo antes / después del nodo dado
Como se muestra en el diagrama anterior, cuando tenemos que agregar un nodo antes o después de un nodo en particular, cambiamos los punteros anterior y siguiente de los nodos antes y después para apuntar apropiadamente al nuevo nodo. Además, los nuevos punteros de nodo apuntan apropiadamente a los nodos existentes.
El siguiente programa en C ++ demuestra todos los métodos anteriores para insertar nodos en la lista doblemente enlazada.
|_+_|Producción:
La lista doblemente enlazada es la siguiente:
1020304050 NULO
El programa anterior construye una lista doblemente enlazada insertando los nodos usando tres métodos de inserción, es decir, insertando el nodo en la parte delantera, insertando el nodo al final e insertando el nodo después del nodo dado.
A continuación, demostramos la misma operación que una implementación de Java.
|_+_|Producción:
La lista doblemente enlazada creada es la siguiente:
implementación de árbol binario c ++
1020304050 nulo
Supresión
Un nodo se puede eliminar de una lista doblemente enlazada desde cualquier posición, como desde el principio, el final o cualquier otra posición o datos dados.
Al eliminar un nodo de la lista doblemente vinculada, primero reposicionamos el puntero que apunta a ese nodo en particular para que los nodos anterior y posterior no tengan ninguna conexión con el nodo que se va a eliminar. Luego podemos eliminar fácilmente el nodo.
Considere la siguiente lista doblemente vinculada con tres nodos A, B, C. Consideremos que necesitamos eliminar el nodo B.
Como se muestra en la serie anterior del diagrama, hemos demostrado la eliminación del nodo B de la lista vinculada dada. La secuencia de operación sigue siendo la misma incluso si el nodo es el primero o el último. El único cuidado que se debe tener es que, en caso de que se elimine el primer nodo, el puntero anterior del segundo nodo se establecerá en nulo.
De manera similar, cuando se elimina el último nodo, el siguiente puntero del nodo anterior se establecerá en nulo. Si se eliminan los nodos intermedios, la secuencia será la anterior.
Dejamos el programa para eliminar un nodo de una lista doblemente enlazada. Tenga en cuenta que la implementación estará en la línea de la implementación de inserción.
Lista inversa doblemente enlazada
Revertir una lista doblemente enlazada es una operación importante. En esto, simplemente intercambiamos los punteros anterior y siguiente de todos los nodos y también intercambiamos los punteros de cabeza y cola.
A continuación se muestra una lista doblemente vinculada:
La siguiente implementación de C ++ muestra la lista doblemente enlazada inversa.
|_+_|Producción:
Lista original doblemente enlazada:
1 2 3 4 5
Lista doblemente enlazada inversa:
5 4 3 2 1
Aquí intercambiamos los punteros izquierdo y derecho y los movemos uno hacia el otro hasta que se encuentran o se cruzan. Luego, se intercambian el primer y el último nodos.
El siguiente programa es la implementación de Java para revertir una lista doblemente enlazada. En este programa también hacemos uso del intercambio de los nodos izquierdo y derecho como hicimos en nuestro programa anterior.
|_+_|Producción:
Lista original doblemente enlazada:
1 2 3 4 5
Lista doblemente enlazada invertida:
5 4 3 2 1
Ventajas / desventajas sobre la lista enlazada individualmente
Analicemos algunas de las ventajas y desventajas de la lista de enlaces dobles sobre la lista de enlaces individuales.
Ventajas:
- La lista doblemente enlazada se puede recorrer tanto hacia adelante como hacia atrás, a diferencia de la lista enlazada individualmente, que solo se puede recorrer en la dirección de avance.
- La operación de eliminación en una lista doblemente vinculada es más eficiente en comparación con la lista individual cuando se proporciona un nodo determinado. En una lista enlazada individualmente, como necesitamos un nodo anterior para eliminar el nodo dado, a veces necesitamos recorrer la lista para encontrar el nodo anterior. Esto golpea la actuación.
- La operación de inserción se puede realizar fácilmente en una lista de enlaces dobles en comparación con la lista de enlaces individuales.
Desventajas:
- Como la lista doblemente enlazada contiene un puntero adicional más, es decir, anterior, el espacio de memoria ocupado por la lista doblemente enlazada es mayor en comparación con la lista enlazada individualmente.
- Dado que hay dos punteros, es decir, el anterior y el siguiente, todas las operaciones realizadas en la lista doblemente enlazada tienen que cuidar estos punteros y mantenerlos, lo que resulta en un cuello de botella en el rendimiento.
Aplicaciones de la lista doblemente vinculada
Se puede aplicar una lista doblemente vinculada en varios escenarios y aplicaciones de la vida real, como se explica a continuación.
- Una baraja de cartas en un juego es un ejemplo clásico de una lista doblemente enlazada. Dado que cada carta de una baraja tiene la carta anterior y la siguiente ordenadas secuencialmente, esta baraja de cartas se puede representar fácilmente utilizando una lista doblemente vinculada.
- Historial / caché del navegador: el caché del navegador tiene una colección de URL y se puede navegar usando los botones de avance y retroceso. Otro buen ejemplo que puede representarse como una lista doblemente vinculada.
- Usado más recientemente (MRU) también se puede representar como una lista doblemente enlazada.
- Otras estructuras de datos como pilas, tabla hash, el árbol binario también se pueden construir o programar utilizando una lista doblemente enlazada.
Conclusión
Una lista doblemente enlazada es una variación de la lista enlazada individualmente. Se diferencia de la lista enlazada individualmente en que cada nodo contiene un puntero adicional al nodo anterior junto con el puntero siguiente.
Esta presencia de un puntero adicional facilita las operaciones de inserción y eliminación en la lista doblemente enlazada, pero al mismo tiempo requiere memoria adicional para almacenar estos punteros adicionales.
Como ya se ha comentado, la lista doblemente enlazada tiene varios usos en escenarios en tiempo real como caché del navegador, MRU, etc. También podemos representar otras estructuras de datos como árboles, tablas hash, etc. utilizando una lista doble enlazada.
En nuestro próximo tutorial, aprenderemos más sobre la lista enlazada circular.
=> Lea la popular serie de capacitación en C ++ aquí.
Lectura recomendada
- Estructura de datos de lista vinculada en C ++ con ilustración
- Estructura de datos de lista enlazada circular en C ++ con ilustración
- Estructura de datos de cola en C ++ con ilustración
- Estructura de datos de pila en C ++ con ilustración
- Estructura de datos de cola de prioridad en C ++ con ilustración
- Las 15 mejores herramientas gratuitas de minería de datos: la lista más completa
- 15 mejores herramientas ETL en 2021 (una lista completa actualizada)
- Introducción a las estructuras de datos en C ++