Está en la página 1de 19

ESTRUCTURA DE DATOS

Semana No 9
TADs LINEALES: LISTAS
Las Listas son tipos de datos abstractos lineales que representan secuencias
de elementos y que presentan una particular flexibilidad en su manejo:
pueden crecer y acortarse según se necesite, todos los elementos del
conjunto se pueden acceder, se puede añadir nuevos elementos en cualquier
lugar de la secuencia donde se especifique, así como se puede eliminar
cualquier elemento del conjunto.
Una lista es equivalente a un contenedor de elementos, donde los valores
pueden repetirse.
Los valores almacenados en ella se conocen como item o elementos de la
lista.
Con frecuencia se representan las listas como una sucesión de elementos
separados por comas:
a1, a2, ...., an

Donde n representa la longitud de la lista y es mayor a 0 y ai representa a


cada elemento. Si n = 0 tendremos una lista vacia.
TADs LINEALES: LISTAS
Mediante Referencias a Objetos
En una lista simplemente enlazada, un Nodo tiene la siguiente estructura:
TADs LINEALES: LISTAS SIMPLEMENTE
ENLAZADAS
Una lista enlazada consiste en una secuencia de nodos, en los que se guardan campos
de datos arbitrarios y una referencia al nodo posterior.
La referencia que cada Nodo contiene no es más que una propiedad del nodo que
almacena la dirección de memoria del siguiente nodo, o un valor Nulo si el nodo no se
encuentra enlazado con un siguiente nodo.
Es decir, si la lista es a1, a2, ... an, el nodo que contiene ai contiene una referencia al
nodo que contiene ai+1, para i = 1, 2, .. n-1.
El nodo que contiene an contiene una referencia a un valor nulo. De esa forma, una
lista enlazada puede ser representada gráficamente de la siguiente forma:

Para tener acceso a todos los elementos de la lista solamente se requiere conocer
la referencia al primer nodo de la lista, también conocido como Header o Cabeza.
En este caso, la posición que se obtiene con la operación getFin() será siempre el
valor NULL.
TADs LINEALES: LISTAS ENLAZADAS
Las listas se pueden dividir en cuatro categorías :
• Listas simplemente enlazadas. Cada nodo (elemento) contiene un
único enlace que lo conecta al nodo siguiente o nodo sucesor. La lista es
eficiente en recorridos directos (“adelante”).
• Listas doblemente enlazadas. Cada nodo contiene dos enlaces, uno a
su nodo predecesor y otro a su nodo sucesor. La lista es eficiente tanto
en recorrido directo (“adelante”) como en recorrido inverso (“atrás”).
• Lista circular simplemente enlazada. Una lista enlazada simplemente
en la que el último elemento (cola) se enlaza al primer elemento
(cabeza) de tal modo que la lista puede ser recorrida de modo circular
(“en anillo”).
• Lista circular doblemente enlazada. Una lista doblemente enlazada en
la que el último elemento se enlaza al primer elemento y viceversa. Esta
lista se puede recorrer de modo circular (“en anillo”) tanto en dirección
directa (“adelante”) como inversa (“atrás”).
TADs LINEALES: LISTAS DOBLEMENTE
ENLAZADAS
En las listas doblemente enlazadas, cada nodo tiene dos enlaces:
uno apunta al nodo anterior, o apunta al valor Nulo si es el primer
nodo; y otro que apunta al siguiente nodo, o apunta al valor Nulo si
es el último nodo.
TADs LINEALES: LISTAS DOBLEMENTE
ENLAZADAS

Existen numerosas aplicaciones en las que es


conveniente poder acceder a los elementos o nodos de
una lista en cualquier orden, tanto hacia adelante como
hacia atrás. En esta lista, cada elemento contiene dos
punteros (referencias), además del valor almacenado.
Una referencia apunta al siguiente elemento de la lista y
la otra referencia apunta al elemento anterior
TADs LINEALES: LISTAS DOBLEMENTE
ENLAZADAS
Las operaciones de una Lista Doble son similares a las de
una Lista: insertar, eliminar, buscar, recorrer... La
operación de insertar un nuevo nodo en la lista debe
realizar ajustes de los dos pointer. La Figura muestra el
problema de insertar un nodo a la derecha del nodo
actual; como se observa, se asignan cuatro enlaces.
TADs LINEALES: LISTAS DOBLEMENTE
ENLAZADAS
La operación de eliminar (borrar) un nodo de la
lista doble necesita enlazar, mutuamente, el
nodo anterior y el nodo siguiente del que se
borra.
TADs LINEALES: LISTAS DOBLEMENTE
ENLAZADAS
NODO LISTA DOBLEMENTE ENLAZADA
Un nodo de una lista doblemente enlazada tiene
dos punteros (referencias) para enlazar con los
nodos izquierdo y derecho, además de la parte
correspondiente al campo dato.
La clase Nodo agrupa los componentes del nodo
de una lista doble; por ejemplo, para datos de
tipo entero:
TADs LINEALES: LISTAS DOBLEMENTE
ENLAZADAS
NODO LISTA DOBLEMENTE ENLAZADA

El constructor asigna un valor al campo dato y las


referencias adelante, atras se
inicializan a null.
TADs LINEALES: LISTAS DOBLEMENTE
ENLAZADAS
Insertar un elemento en una lista doblemente enlazada
La clase ListaDoble encapsula las operaciones básicas de las listas
doblemente enlazadas.
La clase dispone de la variable cabeza que referencia el primer nodo de la
lista, permite acceder a cualquier otro nodo.
El constructor de la clase inicializa la lista vacía (null).
Se puede añadir un nuevo nodo a la lista de distintas formas, según la
posición donde se inserte.
• En la cabeza (elemento primero) de la lista.
• Al final de la lista (elemento último).
• Antes de un elemento especificado.
• Después de un elemento especificado.
TADs LINEALES: LISTAS DOBLEMENTE
ENLAZADAS
Insertar un nuevo elemento en la cabeza de una lista doble
El proceso sigue estos pasos:
1. Crear un nodo con el nuevo elemento y asignar su referencia a la variable nuevo.
2. Hacer que el campo enlace adelante del nuevo nodo apunte a la cabeza (primer nodo) de la
lista original, y que el campo enlace atras del nodo cabeza apunte al nuevo nodo.
3. Hacer que cabeza apunte al nuevo nodo que se ha creado.
A continuación, se escribe el método, miembro de la clase ListaDoble, que implementa la
operación.
TADs LINEALES: LISTAS DOBLEMENTE
ENLAZADAS
Insertar después de un nodo
La inserción de un nuevo nodo se puede realizar también en un nodo intermedio de la
lista.
1. Crear un nodo con el nuevo elemento y asignar su referencia a la variable nuevo.
2. Hacer que el enlace adelante del nuevo nodo apunte al nodo siguiente de n (o bien
a null si n es el último nodo). El enlace atras del nodo siguiente a n (si n no es el último
nodo) tiene que apuntar a nuevo.
3. Hacer que el enlace adelante del nodo n apunte al nuevo nodo. A su vez, el enlace
atras del nuevo nodo debe de apuntar a n.

El método insertaDespues() implementa el algoritmo, supone que la lista es de


números enteros, y naturalmente es un método de la clase ListaDoble.
El primer argumento, anterior, representa el nodo n a partir del cual se enlaza. El
segundo argumento, entrada, es el dato que se añade a la lista.
TADs LINEALES: LISTAS DOBLEMENTE
ENLAZADAS
Insertar después de un nodo
TADs LINEALES: LISTAS DOBLEMENTE
ENLAZADAS
Eliminar un elemento de una lista doblemente enlazada
Quitar un nodo de una lista doble supone realizar el enlace
de dos nodos, el nodo anterior y el nodo siguiente al que se
desea eliminar.
La referencia adelante del nodo anterior debe apuntar al
nodo siguiente, y la referencia atras del nodo siguiente
debe apuntar al nodo anterior.
La memoria que ocupa el nodo se libera automáticamente
en el momento que éste deja de ser referenciado (garbage
collection, recolección de basura).
TADs LINEALES: LISTAS DOBLEMENTE
ENLAZADAS
Eliminar un elemento de una lista doblemente enlazada
El algoritmo es similar al del borrado para una lista simple. Ahora, la dirección
del nodo anterior se encuentra en la referencia atras del nodo a borrar. Los
pasos a seguir son:
1. Búsqueda del nodo que contiene el dato.
2. La referencia adelante del nodo anterior tiene que apuntar a la referencia
adelante del nodo a eliminar (si no es el nodo cabecera).
3. La referencia atras del nodo siguiente a borrar tiene que apuntar a la
referencia atrás del nodo a eliminar (si no es el último nodo).
4. Si el nodo que se elimina es el primero, cabeza, se modifica cabeza para
que tenga la dirección del nodo siguiente.
5. La memoria ocupada por el nodo es liberada automáticamente.
TADs LINEALES: LISTAS DOBLEMENTE
ENLAZADAS
ACTIVIDAD LISTA
DOBLEMENTE ENLAZADA
Escribir un programa para obtener una lista
doblemente enlazada con los caracteres de una
cadena leída desde el teclado. Cada nodo de la
lista tendrá un carácter. Una vez que se haya
creado la lista, escribirla de inicio a fin y de fin a
inicio. Incluir opciones: Agregar por la cabeza,
agregar por el fin, agregar entre 2 nodos,
eliminar un nodo.

También podría gustarte