Está en la página 1de 8

UNIVERSIDAD MAYOR DE SAN ANDRÉS ESTRUCTURA DE DATOS (INF-131)

CARRERA INFORMATICA – CURSO DE TEMPORADA M. Sc. ZARA YUJRA CAMA

CAPÍTULO IV (PARTE II)


LISTAS DOBLES ENLAZADAS
1. INTRODUCCIÓN

Una lista doble, ó doblemente enlazada es una colección de nodos en la cual cada nodo
tiene dos punteros, uno de ellos apuntando a su predecesor (li) y otro a su sucesor (ld).
Por medio de estos punteros se podrá avanzar o retroceder a través de la lista, según se
tomen las direcciones de uno u otro puntero.
La estructura de un nodo en una lista doble es la siguiente:
EnlaIzq Info enlaDer

Nodo

Donde:
EnlaIz: Enlace Izquierdo, es de tipo puntero y apunta al nodo de la izquierda del nodo
actual, en caso de ser el primer nodo apunta a null.
Info: Contiene la información del nodo.
EnlaDer: Enlace derecho, es de tipo puntero y apunta al nodo de la derecha del nodo
actual, en caso de ser el último nodo de la lista, apunta a null.
Existen dos tipos de listas doblemente ligadas:
- Listas dobles lineales. En este tipo de lista doble, tanto el puntero izquierdo del
primer nodo como el derecho del último nodo apuntan a null.
- Listas dobles circulares. En este tipo de lista doble, el puntero izquierdo del primer
nodo apunta al último nodo de la lista, y el puntero derecho del último nodo apunta
al primer nodo de la lista.
2. LISTA ENLAZADA DOBLE LINEAL

En la figura siguiente se muestra un ejemplo de una lista doblemente ligada lineal que
almacena nombres:

1
UNIVERSIDAD MAYOR DE SAN ANDRÉS ESTRUCTURA DE DATOS (INF-131)
CARRERA INFORMATICA – CURSO DE TEMPORADA M. Sc. ZARA YUJRA CAMA

El programa para listas lineales dobles en java, para elementos de tipo cadena es el
siguiente:
Programa 20 en Java

package listas;
import java.util.Scanner;
public class ListaDoble
{
Scanner sc=new Scanner(System.in);
class Nodo
{
Nodo EnlaIz;
String Info;
Nodo EnlaDer;
}
Nodo p=null;

void InsertarInicio(String elem)


{ //Inserción al inicio de la lista
Nodo q;
q = new Nodo();
q.Info = elem;
q.EnlaIz = null;
if (p==null)
{
q.EnlaDer=null;
p = q;
}
else
{
Q.EnlaDer =p;
p.EnlaIz=Q;
p=Q;
}
}

void InsertarFinal(String elem)


{
//Inserción al final de la lista
Nodo T;
Nodo Q=new Nodo();
Q.Info=elem;
Q.EnlaDer=null;
if (p==null)
{
Q.EnlaIz=null;
p=Q;
}

2
UNIVERSIDAD MAYOR DE SAN ANDRÉS ESTRUCTURA DE DATOS (INF-131)
CARRERA INFORMATICA – CURSO DE TEMPORADA M. Sc. ZARA YUJRA CAMA

else
{
T=p;
while (T.EnlaDer!=null)
{
T=T.EnlaDer;
}
T.EnlaDer=Q;
Q.EnlaIz=T;
}
}

String EliminarInicio()
{
//Eliminar elemento de la lista
String elem="";
Nodo q = p;
elem = p.Info;
if(p.EnlaDer ==null)
p=null;
else
{
p=p.EnlaDer;
p.EnlaIz=null;
Q=null;
}
return elem;
}

void recorrido ()
{
//Mostrar los elementos de la lista
System.out.println (" \n....RECORRIDO DE LA LISTA....");
Nodo q = p;
while (q != null)
{
System.out.print (q.Info + ", ");
q = q.EnlaDer;
}
}

boolean vacia()
{
//Verifica si la lista esta vacia
if (p==null)
return true;
else
return false;
}

3
UNIVERSIDAD MAYOR DE SAN ANDRÉS ESTRUCTURA DE DATOS (INF-131)
CARRERA INFORMATICA – CURSO DE TEMPORADA M. Sc. ZARA YUJRA CAMA

public void llenarLista ()


{
//Llenar N elementos en la lista
int N;
String elem;
System.out.println ("Cuantos elementos desea ingresar a la lista ?");
N = sc.nextInt();
for (int i = 1 ; i <= N ; i++)
{
System.out.print ("ingrese elemento ....");
elem =sc.next();
InsertarInicio (elem);
}
}
} //Fin del Programa

La aplicación para manejo de listas dobles es la siguiente:


Programa 20 en Java

package listas;
public class AppListaDoble
{
public static void main(String arg[])
{
ListaDoble A;
A=new ListaDoble();
A.llenarLista();
A.recorrido();
A.EliminarInicio();
System.out.println("\n\n Eliminando un elemento del inicio de la lista");
A.recorrido();
}
}

4
UNIVERSIDAD MAYOR DE SAN ANDRÉS ESTRUCTURA DE DATOS (INF-131)
CARRERA INFORMATICA – CURSO DE TEMPORADA M. Sc. ZARA YUJRA CAMA

Salida del programa

3. LISTAS CIRCULARES DOBLES

Debido a que las listas dobles circulares son más eficientes, en la figura siguiente se
muestra un ejemplo de una lista doblemente ligada circular que almacena números:

EJERCICIOS RESUELTOS CON LISTAS


1) Insertar un nuevo nodo después del k-esimo nodo de la lista.
El procedimento en java es el siguiente, este procedimento adicionar al programa de
ListaLineal.java.
Programa 21 en Java
//insertar un nuevo nodo despues del k-esimo nodo de la lista
void InsertaKesimo(String e, int k)
{
nodo q,t;
int c;
q=new nodo();
q.info=e;
t=p;
c=1;
while (t.dirsgte!=null && c!=k)
{
T=T.dirsgte;

5
UNIVERSIDAD MAYOR DE SAN ANDRÉS ESTRUCTURA DE DATOS (INF-131)
CARRERA INFORMATICA – CURSO DE TEMPORADA M. Sc. ZARA YUJRA CAMA

c++;
}
Q.dirsgte=T.dirsgte;
T.dirsgte=Q;
}

La aplicación para insertar el nombre de Laura, después del tercer nodo, será el
siguiente:
Programa 21 en Java
package listas;
public class AppListaLineal
{
public static void main(String arg[])
{
ListaLineal A;
A=new ListaLineal();
A.llenarLista();
A.recorrido();
System.out.println("\n\n INSERTANDO EL NOMBRE DE LAURA DESPUES DEL 3ER
NODO");
A.InsertaKesimo("Laura", 3);
A.recorrido();
}
}

Salida del programa

6
UNIVERSIDAD MAYOR DE SAN ANDRÉS ESTRUCTURA DE DATOS (INF-131)
CARRERA INFORMATICA – CURSO DE TEMPORADA M. Sc. ZARA YUJRA CAMA

2) Llevar el primer nodo de la lista al final de la lista doble.


Codificamos el procedimento em el programa de ListaDoble
Programa 22 en Java
//llevar el primer nodo al final de la lista doble
void LlevarElPrimerAlUltimo()
{
Nodo q,t;
q = p;
p = p.EnlaDer;
t = p;
while (t.EnlaDer != null)
{
t = t.EnlaDer;
}
t.EnlaDer = Q;
q.EnlaIz = t;
q.EnlaDer = null;
}
}

Escribimos una aplicación para llamar a este procedimiento que lleva al final el primer
nodo, como se ve a continuación:
Programa 22 en Java

package listas;
public class AppListaDoble
{
public static void main(String arg[])
{
ListaDoble A;
A=new ListaDoble();
A.llenarLista();
A.recorrido();
A.LlevarElPrimerAlUltimo();
System.out.println("\n\n LLEVANDO EL PRIMER NODO AL ULTIMO DE LA LISTA");
A.recorrido();
}
}

7
UNIVERSIDAD MAYOR DE SAN ANDRÉS ESTRUCTURA DE DATOS (INF-131)
CARRERA INFORMATICA – CURSO DE TEMPORADA M. Sc. ZARA YUJRA CAMA

Salida del programa

EJERCICIOS PROPUESTOS PARA LA PRÁCTICA NRO. 5

1) Imprimir solo los nombres que empiezan por una vocal, en una lista circular simple.
2) Implementar una lista doble circular y realizar su aplicación.
3) En una lista doble lineal eliminar todos los elementos X, donde X es dado por el
usuario.
4) Insertar N nodos antes del último nodo de una lista doble.
5) Eliminar el segundo nodo de una lista doble lineal.
6) Insertar un nodo al final de la lista circular simple.
7) Eliminar un nodo del final de uma lista circular simple
8) Intercambiar el primer nodo com el ultimo nodo de uma lista doble lineal.

También podría gustarte