Documentos de Académico
Documentos de Profesional
Documentos de Cultura
- Listas enlazadas
Listas Enlazadas
o
Lista de Enlace Simple
o
Los Algoritmos de Concatenacin e Inversin
o
Lista Doblemente Enlazada
Algoritmo de Insercin-Ordenada
o
Lista de Enlace Circular
o
Listas Enlazadas frente a Arrays
Listas Enlazadas
Adems de los arrays! otra de las estructuras de datos muy utilizada es la lista enlazada" Esta estructura
implica cuatro conceptos# clase auto-refenciada! nodo! campo de enlace y enlace"
Clase auto-referenciada: una clase con al menos un campo cuyo tipo de referencia es el nombre de
la clase#
class Employee {
private int empno;
private String name;
private double salary;
public Employee next;
// Other members
}
Employee
es una clase auto-referenciada por$ue su campo
next
tiene el tipo
Employee
"
Nodo: un ob%eto creado desde una clase auto-referenciada"
Campo de enlace: un campo cuyo tipo de referencia es el nombre de la clase" En el fragmento de
cdigo anterior!
next
es un campo de enlace" &or el contrario!
empno
!
name
! y
salary
son campos
no de enlace"
Enlace: la referencia a un campo de enlace" En el fragmento de cdigo anterior! la referencia
next
a
un nodo
Employee
es un enlace"
Los cuatro conceptos de arriba nos llevan a la siguiente definicin# una lista enlazada es una secuencia de
nodos que se interconectan mediante sus campos de enlace" En ciencia de la computacin se utiliza una
notacin especial para ilustrar las listas enlazadas" En la siguiente imagen aparece una variante de esta
notacin $ue utilizar' a lo largo de esta seccin#
1
Estructura de datos Unidad 3.- Listas enlazadas
La figura anterior presenta tres nodos# A! ( y C" Cada nodo se divide en reas de contenido )en naran%a* y
una o ms reas de enlace )en verde*" Las reas de contenido representan todos los campos $ue no son
enlaces! y cada rea de enlace representa un campo de enlace" Las reas de enlace de A y C tienen unas
flec+as para indicar $ue referencian a otro nodo del mismo tipo )o subtipo*" La ,nica rea de enlace de (
incorpora una - para indicar una referencia nula" En otras palabras! ( no est conectado a ning,n otro
nodo"
Aun$ue se pueden crear muc+os tipos de listas enlazadas! las tres variantes ms populares son la lista de
enlace simple! la lista doblemente enlazada y la lista enlazada circular" E.ploremos esas variantes!
empezando con la lista enlazada"
Lista de Enlace Simple
/na lista de enlace simple es una lista enlazada de nodos! donde cada nodo tiene un ,nico campo de
enlace" /na variable de referencia contiene una referencia al primer nodo! cada nodo )e.cepto el ,ltimo*
enlaza con el nodo siguiente! y el enlace del ,ltimo nodo contiene
null
para indicar el final de la lista"
Aun$ue normalmente a la variable de referencia se la suele llamar
top
! usted puede elegir el nombre $ue
$uiera" La siguiente figura presenta una lista de enlace simple de tres nodos! donde
top
referencia al nodo
A! A conecta con ( y ( conecta con C y C es el nodo final#
/n algoritmo com,n de las listas de enlace simple es la insercin de nodos" Este algoritmo est implicado
de alguna forma por$ue tiene muc+o $ue ver con cuatro casos# cuando el nodo se debe insertar antes
del primer nodo; cuando el nodo se debe insertar despus del ltimo nodo; cuando el nodo se debe
insertar entre dos nodos; y cuando la lista de enlace simple no existe" Antes de estudiar cada caso
consideremos el siguiente pseudocdigo#
DECL!E CLSS "ode
DECL!E S#!$"% name
DECL!E "ode next
E"D DECL!E
DECL!E "ode top & "'LL
Este pseudocdigo declara una clase auto-referenciada llamada
"ode
con un campo llamado
name
y un
campo de enlace llamado
next
" 0ambi'n declara una variable de referencia
top
)del tipo
"ode
* $ue
contiene una referencia al primer
"ode
de una lista de enlace simple" Como la lista todav1a no e.iste! el
valor inicial de
top
es
"'LL
" Cada uno de los siguientes cuatro casos asume las declaraciones de
"ode
y
top
#
La lista de enlace simple no existe:
Este es el caso ms simple" Se crea un
"ode
! se asigna su referencia a
top
! se inicializa su campo no
de enlace! y se asigna
"'LL
a su campo de enlace" El siguiente pseudocdigo realiza estas tareas#
top & "E( "ode
top)name & **
top)next & "'LL
2
Estructura de datos Unidad 3.- Listas enlazadas
En la siguiente imagen se puede ver la lista de enlace simple $ue emerge del pseudocdigo anterior#
El nodo debe insertarse antes del primer nodo:
Se crea un
"ode
! se inicialia su campo no de enlace! se asigna la referencia de
top
al campo de enlace
next
! y se asigna la referencia del
"ode
recien creado a
top
" El siguiente pseudocdigo )$ue asume
$ue se +a e%ecutado el pseudocdigo anterior* realiza estas tareas#
DECL!E "ode temp
temp & "E( "ode
temp)name & *+*
temp)next & top
top & temp
El resultado del listado anterior aparece en la siguiente imagen#
El nodo debe insertarse detrs del ltimo nodo:
Se crea un
"ode
! se inicializa su campo no de enlace! se asigna
"'LL
al campo de enlace! se atraviesa
la lista de enlace simple +asta el ,ltimo
"ode
! y se asigna la referencia del
"ode
recien creado al campo
next
del ,ltimo nodo" El siguiente pseudocdigo realiza estas tareas#
temp & "E( "ode
temp)name & *C*
temp)next & "'LL
DECL!E "ode temp,
temp, & top
// (e assume top -and temp,. are not "'LL
// because o/ the previous pseudocode
(0$LE temp,)next $S "O# "'LL
temp, & temp,)next
E"D (0$LE
// temp, no1 re/erences the last node
temp,)next & temp
3
Estructura de datos Unidad 3.- Listas enlazadas
La siguiente imagen revela la lista despu's de la insercin del nodo
C
despu's del nodo
"
El nodo se debe insertar entre dos nodos:
Este es el caso ms comple%o" Se crea un
"ode
! se inicializa su campo no de enlace! se atraviesa la
lista +asta encontrar el
"ode
$ue aparece antes del nuevo
"ode
! se asigna el campo de enlace del
"ode
anterior al campo de enlace del
"ode
recien creado! y se asigna la referencia del
"ode
recien
creado al campo del enlace del
"ode
anterior" El siguiente pseudocdigo realiza estas tareas#
temp & "E( "ode
temp)name & *D*
temp, & top
// (e assume that the ne1ly created "ode is inserted a/ter "ode
// and that "ode exists) $n the real 1orld2 there is no
// guarantee that any "ode exists2 so 1e 1ould need to chec3
// /or temp, containing "'LL in both the (0$LE loop4s header
// and a/ter the (0$LE loop completes)
(0$LE temp,)name $S "O# **
temp, & temp,)next
E"D (0$LE
// temp, no1 re/erences "ode )
temp)next & temp,)next
temp,)next & temp
La siguiente imagen muestra la insercin del nodo
D
entre los nodos
y
C
"
El siguiente listado presenta el e$uivalente 2ava de los e%emplos de pseudocdigo de inserccin anteriores#
// SLL$nsDemo)5ava
class SLL$nsDemo {
static class "ode {
String name;
"ode next;
}
4
Estructura de datos Unidad 3.- Listas enlazadas
public static void main -String 67 args. {
"ode top & null;
// 8) #he singly lin3ed list does not exist
top & ne1 "ode -.;
top)name & **;
top)next & null;
dump -*Case 8*2 top.;
// ,) #he singly lin3ed list exists2 and the node must be inserted
// be/ore the /irst node
"ode temp;
temp & ne1 "ode -.;
temp)name & *+*;
temp)next & top;
top & temp;
dump -*Case ,*2 top.;
// 9) #he singly lin3ed list exists2 and the node must be inserted
// a/ter the last node
temp & ne1 "ode -.;
temp)name & *C*;
temp)next & null;
"ode temp,;
temp, & top;
1hile -temp,)next :& null.
temp, & temp,)next;
temp,)next & temp;
dump -*Case 9*2 top.;
// ;) #he singly lin3ed list exists2 and the node must be inserted
// bet1een t1o nodes
temp & ne1 "ode -.;
temp)name & *D*;
temp, & top;
1hile -temp,)name)e<uals -**. && /alse.
temp, & temp,)next;
temp)next & temp,)next;
5
Estructura de datos Unidad 3.- Listas enlazadas
temp,)next & temp;
dump -*Case ;*2 top.;
}
static void dump -String msg2 "ode top"ode. {
System)out)print -msg = * *.;
1hile -top"ode :& null. {
System)out)print -top"ode)name = * *.;
top"ode & top"ode)next;
}
System)out)println -.;
}
}
El m'todo
static void dump-String msg2 "ode top"ode.
itera sobre la lista e imprime su
contenido" Cuando se e%ecuta
SLL$nsDemo
! las repetidas llamadas a este m'todo dan como resultado la
siguiente salida! lo $ue coincide con las imgenes anteriores#
Case 8
Case , +
Case 9 + C
Case ; + D C
Nota:
SLL$nsDemo y los e%emplos de pseudocdigo anteriores empleaban un algoritmo de b,s$ueda lineal
orientado a listas enlazadas para encontrar un "ode espec1fico" Indudablemente usted utilizar este otro
algoritmo en sus propios programas#
Bsqueda del ultimo Node:
// ssume top re/erences a singly lin3ed list o/ at least one "ode)
"ode temp & top // (e use temp and not top) $/ top 1ere used2 1e
// couldn4t access the singly lin3ed list a/ter
// the search /inished because top 1ould re/er
// to the /inal "ode)
(0$LE temp)next $S "O# "'LL
temp & temp)next
E"D (0$LE
// temp no1 re/erences the last "ode)
Bsqueda de un Node especfico:
// ssume top re/erences a singly lin3ed list o/ at least one "ode)
"ode temp & top
(0$LE temp $S "O# "'LL "D temp)name $S "O# ** // Search /or **)
6
Estructura de datos Unidad 3.- Listas enlazadas
temp & temp)next
E"D (0$LE
// temp either re/erences "ode or contains "'LL i/ "ode not /ound)
Otro algoritmo com,n de las listas de enlace simples es el borrado de nodos" Al contrario $ue la insercin de
nodos! slo +ay dos casos a considerar#
Borrar el rimer nodo:
Asigna el enlace del campo
next
del nodo referenciado por
top
a
top
#
top & top)next; // !e/erence the second "ode -or "'LL i/ there is only one
"ode.
La siguiente imagen presenta las vistas anterior y posterior de una lista donde se +a borrado el
primer nodo" En esta figura! el nodo
+
desaparece y el nodo