Académique Documents
Professionnel Documents
Culture Documents
SEMANA 5
Listas enlazadas
Todos los derechos de autor son de la exclusiva propiedad de IACC o de los otorgantes de sus licencias. No está
permitido copiar, reproducir, reeditar, descargar, publicar, emitir, difundir, poner a disposición del público ni 1
ESTE
utilizarDOCUMENTO
los contenidos paraCONTIENE LAdeSEMANA
fines comerciales 5
ninguna clase.
2
ESTE DOCUMENTO CONTIENE LA SEMANA 5
ÍNDICE
3
ESTE DOCUMENTO CONTIENE LA SEMANA 5
LISTA ENLAZADA
OBJETIVO ESPECÍFICO
Analizar la utilización y las operaciones asociadas a listas enlazadas.
INTRODUCCIÓN
Las listas enlazadas fueron creadas para intentar darle solución a diferentes problemas durante la
década de los 50. A pesar de que fueron muy conocidas en sus inicios, en la actualidad se
implementan solo en los bajos niveles informáticos de programación (a nivel de sistemas
operativos), por lo cual es básico conocer su estructura y los diferentes puntos desde los cuales
pueden ser operadas.
A su vez, las listas enlazadas son más dinámicas que los arreglos, pero quizás se puedan notar más
ventajas una vez que se profundice acerca de sus operaciones y aplicaciones dentro de la
programación.
1. LISTAS ENLAZADAS
Los nodos están compuestos por dos campos: en uno se almacena la información y en el otro se
almacena la posición del siguiente nodo. Estos pueden estar almacenados en la memoria y no es
necesario que estén uno detrás de otro, por lo que su inserción o extracción puede ser desde
cualquier punto en la lista, es decir, que su almacenamiento en la memoria no necesariamente
debe ser igual al orden en el que son enlazados.
4
ESTE DOCUMENTO CONTIENE LA SEMANA 5
Dentro del nodo, el campo que almacena la posición del siguiente nodo se conoce como puntero.
Si el puntero contiene el valor null, significa que ese nodo no apunta hacia ningún otro elemento
dentro de la lista enlazada, lo que puede implicar que la lista está vacía o que ese nodo es el
último elemento de la lista.
1.2.1. INSERTAR
La inserción de un elemento en las listas se realiza desde distintos puntos: al inicio, en el medio o
al final. Por ejemplo, para realizar la inserción de un nuevo nodo en una lista, se debe conocer el
dato a insertar, el puntero donde se desea insertar para recorrer la lista y realizar los cambios de
punteros respectivos. Para controlar el acceso, la inserción y la extracción de datos de una lista es
necesario conocer ciertos elementos: el nodo que ocupa la primera y la última posición y, en
algunos casos, el número de nodos que contiene la lista.
Se conoce que las listas enlazadas tienen una variable que se denomina primero y este valor
representa el primer nodo de la lista. Ahora bien, una lista vacía tiene cero elementos dentro de sí,
por lo que el puntero primero estará apuntando a un valor null. Para insertar un elemento nuevo
dentro de una lista vacía, solo se debe conocer el elemento a insertar y hacer que el puntero
primero apunte a este nuevo elemento insertado. A su vez, las listas tienen una variable que
representa su último valor, así que si se agregó un elemento a una lista, este será el primero y el
último al mismo tiempo. Al crear una instancia de tipo lista enlazada se crean dos variables con
valores nulos, que indican que la lista está vacía: primero y último.
5
ESTE DOCUMENTO CONTIENE LA SEMANA 5
Inserción en lista simple vacía
La lista al ser inicializada, se le asignan valores null a los punteros primero y último. Al insertar un
elemento este pasaría a ser el primero y último a la vez, por lo que se debe asignar la posición de
las variables y, de esta manera, se inserta un elemento en una lista vacía. El nodo insertado tendrá
en su puntero un valor null, lo que significa que no existe un elemento después de él.
Teniendo en cuenta la operación anterior, insertar al inicio de la lista, solo se debe hacer que el
puntero del nodo nuevo apunte hacia el nodo que ocupa la primera posición de la lista y luego
hacer que la variable primero apunte hacia el elemento que se desea insertar. De esta manera se
desplazan los demás elementos automáticamente y el nodo que ocupaba la primera posición en la
lista pasa a ser el segundo.
6
ESTE DOCUMENTO CONTIENE LA SEMANA 5
Inserción al inicio de una lista simple
Al insertar un elemento al inicio de la lista, posteriormente este pasaría a ser el primero, por lo
que se debe asignar su posición a la variable primero. El nodo insertado tendrá en su puntero la
posición del nodo que antes ocupaba la primera posición, lo que significa que existe un elemento
después de él.
7
ESTE DOCUMENTO CONTIENE LA SEMANA 5
INSERCIÓN INTERMEDIA EN LISTAS
Para realizar la inserción después de cierta posición dentro de la lista, se debe tener como
parámetro el elemento a insertar y la posición después de la cual se desea el nuevo elemento.
Dentro del proceso, se ejecuta un ciclo que va desde el primer nodo de la lista hasta el número
que se haya pasado como clave al solicitar la función. Solo se ejecuta un ciclo hasta llegar a la
posición deseada y se realizan los cambios a los punteros respectivos. Aquí los punteros, primero y
último, permanecen iguales a menos que alguno de los nodos que ocupan esta posición sea el que
se desea eliminar.
8
ESTE DOCUMENTO CONTIENE LA SEMANA 5
En código PHP sería el siguiente:
Para insertar un nodo al final de la lista, el puntero del nodo a insertar debe apuntar a un valor null
y el puntero del nodo en la última posición debe apuntar a la posición del nuevo nodo insertado.
La variable que determina la posición del último elemento de la lista ahora debe apuntar hacia el
nuevo nodo insertado y, de esta manera, se inserta al final de una lista.
9
ESTE DOCUMENTO CONTIENE LA SEMANA 5
Inserción al final de una lista simple
publicfunctionInsertarUltimo($elemento) {
if ($this->head == null) {
$this->head = new Nodo($elemento);
} else {
$actual = $this->head;
while ($actual->proximo != null)
{
$actual = $actual->proximo;
}
$actual->proximo = new Nodo($elemento);
}
self::$count++;
}
10
ESTE DOCUMENTO CONTIENE LA SEMANA 5
Para acceder a un nodo en la lista, esta debe ser recorrida desde el inicio, y
el puntero siguiente permite el enlace hasta el próximo nodo. Dicho
recorrido se hace en una sola dirección, que va desde el primer elemento
hasta el último.
1.2.2. ELIMINAR
La eliminación de un nodo dentro de una lista consiste en redireccionar los punteros anteriores al
nodo a eliminar. De esta manera, la cadena no pierde su enlace, se libera la memoria y se
mantienen las conexiones entre nodos. Existen dos tipos de eliminación en una lista: al inicio o
después de cierto nodo específico.
Teniendo en cuenta la definición anterior, eliminar al inicio de la lista no es más que hacer que el
puntero del nodo que ocupa la primera posición de la lista apunte hacia el segundo elemento. De
esta forma, el nodo que ocupaba la segunda posición en la lista pasa a ser el primero.
11
ESTE DOCUMENTO CONTIENE LA SEMANA 5
En código PHP sería el siguiente:
Para realizar la eliminación después de cierta posición dentro de la lista, se debe tener como
parámetro la posición después de la cual se desea eliminar el elemento. Dentro del proceso, se
recibe como parámetro la posición antes del nodo que se desea eliminar y se ejecuta un ciclo que
va desde el primer nodo de la lista hasta el número que se haya pasado como clave al ejecutar la
función. Solo se ejecuta un ciclo hasta llegar a la posición deseada y es allí donde se realizan los
cambios a los punteros respectivos. El puntero en la posición recibida como parámetro ahora debe
apuntar al elemento después de su siguiente posición, saltando una posición y dejando solo al
nodo que se desea eliminar. Aquí los punteros primero y último permanecen iguales a menos que
alguno de los nodos que ocupan esta posición sea el que se desea eliminar.
12
ESTE DOCUMENTO CONTIENE LA SEMANA 5
Eliminación intermedia en una lista simple
13
ESTE DOCUMENTO CONTIENE LA SEMANA 5
1.2.3. RECORRIDO
El recorrido de una lista se hace desde el primer nodo dentro de la lista hasta el último, siempre y
cuando la lista no se encuentre vacía. A continuación, se realizará la creación de una lista, se
insertarán nodos y se imprimirá la lista al final con todos sus elementos, donde la función imprimir
recorrerá toda la lista.
<?php
class Nodo
{
public $dato;
public $proximo;
$aux->proximo = $this->head;
$this->head = $aux;
14
ESTE DOCUMENTO CONTIENE LA SEMANA 5
}
self::$count++;
}
public function InsertarUltimo($elemento) {
if ($this->head == null) {
$this->head = new Nodo($elemento);
} else {
$actual = $this->head;
while ($actual->proximo != null)
{
$actual = $actual->proximo;
}
$actual->proximo = new Nodo($elemento);
}
self::$count++;
}
//Insertar luego de cierta posición
public function InsertarDespues($elemento,$key){
if($key == 0){
$this->InsertarPrimero($elemento);
}
else{
$aux = new Nodo($elemento);
$actual = $this->head;
$anterior = $this->head;
for($i=0;$i<$key;$i++)
{
$anterior = $actual;
$actual = $actual->proximo;
}
$anterior->proximo = $aux;
$aux->proximo = $actual;
self::$count++;
}
}
15
ESTE DOCUMENTO CONTIENE LA SEMANA 5
$str.=$elemento. ' - ';
}
echo $str;
}
}
$lista = new ListaEnlazada();
$lista->InsertarPrimerovacia(123);
$lista->InsertarUltimo('A');
$lista->InsertarUltimo(20);
$lista->InsertarPrimero(48);
$lista->InsertarUltimo('B');
$lista->InsertarPrimero('D');
$lista->InsertarPrimero(100);
$lista->InsertarDespues(88888,1);
$lista->ImprimirLista();
?>
1.2.4. BÚSQUEDA
Para realizar una búsqueda de un dato dentro de una lista, se debe recibir como parámetro el dato
a buscar y comenzar a recorrer la lista desde la posición cero, que es el primer elemento de la lista,
hasta el último. Esto se realiza a través de un ciclo que va desde cero hasta el contador actual de
elementos de la lista que se obtiene al ejecutar la función determinada para contar los nodos. Una
16
ESTE DOCUMENTO CONTIENE LA SEMANA 5
vez que se tengan estos datos, se comparan nodo a nodo con el parámetro recibido hasta que se
encuentre el nodo o hasta llegar al final de la lista y no haberlo encontrado.
publicfunctionBuscarDato($elemento)
{
$encontro = false;
$contador = $this->ContarNodos();
$actual = $anterior = $this->head;
for($i=0;$i<$contador;$i++)
{
if ($actual->dato == $elemento) {
$encontro = true;
$posi = $i;
break;
}
else {
$anterior = $actual;
$actual = $actual->proximo;
}
}
if ($encontro != false){
echo "El elemento se encuentra dentro de la lista en la posicion: ".$posi;
} else {
echo "El elemento no se encuentra dentro de la lista.";
}
}
1.2.5. TAMAÑO
El tamaño de la lista es dinámico debido a que va aumentando a medida que se van insertando
elementos dentro de una lista. A diferencia de los arreglos, al crear una instancia de tipo lista solo
se inicializan los punteros primero y último, y de ahí en adelante se agregan nodos de acuerdo a lo
que necesite el usuario. Para el caso de determinar la cantidad de elementos dentro de una lista
basta con contar sus elementos a través de una función incorporada en PHP conocida como count.
Esta función retorna un valor de tipo entero que representa la cantidad de nodos dentro de la
lista.
17
ESTE DOCUMENTO CONTIENE LA SEMANA 5
En código PHP sería:
Funciones de arrays
Una lista enlazada simple representa una estructura de datos lineal, pero el orden de sus nodos no
es necesariamente igual al espacio que ocupan en memoria. Además es dinámica, pues va
creciendo dependiendo de lo que se vaya necesitando. Se puede insertar o eliminar un elemento
desde cualquier punto de la lista, pero de igual manera consume recursos debido a que, para
realizar alguna operación con ella, se debe recorrer la lista hasta llegar al punto de inserción,
búsqueda o eliminación, el cual puede estar al inicio, centro o final de la lista.
Mantiene dos valores importantes que son: primero y último, los que representan
respectivamente al primer y al último nodo de la lista. Su utilización dependerá de si se necesita
controlar el inicio y fin de la lista, y este tipo de lista lo permite gracias a los valores anteriormente
mencionados.
18
ESTE DOCUMENTO CONTIENE LA SEMANA 5
Ejemplo:
Una lista enlazada circular generalmente se implementa cuando se dispone de poca memoria y no
se necesita una estructura lineal para su implementación. Los nodos primero y último están
enlazados debido a que el último no apunta hacia un valor null, sino hacia el primero. Para
recorrer este tipo de lista se puede comenzar desde cualquier nodo y regresar al mismo, al
terminar el recorrido. Se puede decir que la lista circular no tiene un inicio y un fin.
Ejemplo:
En ambos casos sus implementaciones van más allá de su estructura, pues se puede implementar
muy bien un arreglo o una cola utilizando una lista, siempre y cuando se conozcan y se diferencien
sus operaciones y limitaciones.
En la actualidad no se encuentran muchas aplicaciones que utilicen las listas enlazadas como tipo
de estructura de datos, debido a su alto consumo de memoria y su alto costo de recorrido. Sin
embargo, se utilizan en los buffers de los servidores, para consumir datos y, a su vez, recuperar
memoria utilizada, o en la distribución y organización de los ficheros de un sistema operativo.
19
ESTE DOCUMENTO CONTIENE LA SEMANA 5
COMENTARIO FINAL
Las listas enlazadas tienen un beneficio con respecto a los arreglos y es que el orden de sus
elementos, los cuales permanecen enlazados a través de punteros, puede ser diferente al orden
en el que son almacenados en memoria. Esto permite que su recorrido sea diferente al de su
almacenamiento.
Se pueden insertar o eliminar elementos desde cualquier punto de la lista, pero su acceso no es
igual debido a que se debe recorrer toda o parte de la lista para realizar alguna operación.
A pesar de que son muy útiles y de fácil implementación, pueden llegar a consumir muchos más
recursos de los necesarios, por ejemplo, a la hora de ejecutar una búsqueda. Es por ello que se
debe tener en cuenta el uso de recursos a la hora de una implementación eficiente.
20
ESTE DOCUMENTO CONTIENE LA SEMANA 5
REFERENCIAS
Campos, J. (1995). Estructuras de datos y algoritmos. 1.ª edición. España: Prensas Universitarias de
Zaragoza.
Hernández, R.; Lázaro, J.; Dormido, R. y Ros, S. (2001). Estructuras de datos y algoritmos. España:
Prentice-Hall.
21
ESTE DOCUMENTO CONTIENE LA SEMANA 5
22
ESTE DOCUMENTO CONTIENE LA SEMANA 5