Vous êtes sur la page 1sur 19

III. Listas enlazadas.

Una lista es una coleccin o secuencia de elementos ordenados uno tras otro, en la que cada elemento se conecta por medio de un apuntador. A cada elemento de la lista se le llama nodo. Cada nodo esta constituido por dos partes las cuales son:
1a. Parte Informacin

2a. Parte Apuntador que seala al siguiente nodo

Representacin grafica
Nodo 1 Nodo 2 Nodo n /

Debido a que el ltimo elemento de la lista no esta sealando a ningn elemento existe diferentes formas de representarlo grficamente:

Nod x

Nodo x

Nodo x null

III.1.

Listas enlazadas.

III.1.1. Simples. Cada nodo contiene un nico enlace que conecta al siguiente nodo. La lista se recorre solamente hacia adelante.

e1

e2

e3

en

Apuntadores al inicio y al final de la lista


Para poder manipular una lista de una manera eficiente es utilizar apuntadores al inicio de las lista y al final. Para poder lograr esto debemos utilizar un apuntador al frente o inicio de la lista y al final o cola.

65

inicio e1 e2 e3 en fin /

III.1.2. Dobles. Cada nodo contiene dos enlaces o apuntadores, el enlace izquierdo apunta al nodo predecesor y el enlace derecho apunta al nodo sucesor.

/ e1

e2

e3

en /

III.1.3. Circulares. El ltimo nodo de la lista apunta al primer elemento de la lista.

e1

e2

e3

en

Cada nodo esta enlazado a su predecesor y sucesor y el ltimo apunta a primer elemento y el primero apunta al ltimo.

e1

e2

e3

en

III.1.4. Multilistas. En las multilistas existen enlaces verticales y horizontales.

66

III.1.5. Clases para la implementacin de listas.

Clase nodoSimple
class nodoSimple { private String dato; private nodoSimple enlace; nodoSimple( String d ) { this( d, null ); } nodoSimple( String d, nodoSimple e ) { dato = new String(d); enlace = e; } String obtenDato() { return dato; } nodoSimple obtenEnlace() { return enlace; } void cambiaDato(String d) { dato = new String(d); } void cambiaEnlace(nodoSimple e) { enlace = e; } }

Operaciones en listas
Las operaciones bsicas sobre una lista son: Tipo de datos de la lista Declaracin de un nodo Crear la lista Comprobar si la lista esta vaca Insertar un elemento Eliminar un elemento Buscar un elemento Recorrer la lista 67

Tipo de datos de la lista


En cada tipo de lista se debe definir el tipo de dato que se va a manejar, para nuestro ejemplo tomaremos el tipo String.

Declaracin de un nodo
nodoSimple nodo, inicio = null, fin = null;

Comprobar si la lista esta vaca


Para comprobar si la lista esta vaca, simplemente se debe de preguntar si inicio es igual a null.

Insertar un elemento
Existen tres formas de insertar un nodo en una lista, los cuales pueden ser: Insertar al inicio de la lista

nodoSimple nodo, inicio = null, fin = null; ... .. . Capturar la informacin nodo = new nodoSimple(informacin); ... .. . nodo.cambiaEnlace(inicio); inicio = nodo; Producto de Aprendizaje: 1. Elabore un programa en Java que lea 5 nombres desde el teclado y los inserte al inicio en una lista ligada simple y al final imprima la lista.

68

Insertar al final de la lista

nodoSimple nodo, inicio = null, fin = null; ... .. . Capturar la informacin nodo = new nodoSimple(informacin); ... .. . fin.cambiaEnlace(nodo); fin = nodo; Producto de Aprendizaje: 2. Elabore un programa en Java que lea 5 nombres desde el teclado y los inserte al final en una lista ligada simple y al final imprima la lista.

Insertar entre elementos de la lista

nodoSimple nodo, inicio = null, fin = null; ... .. .

69

Capturar la informacin nodo = new nodoSimple(informacin); ... .. . pre.cambiaEnlace(nodo); nodo.cambiaEnlace(suc); Producto de Aprendizaje: 3. Elabore un programa en Java que lea 5 nombres desde el teclado, los inserte al final en una lista ligada simple, posteriormente solicite un nuevo nombre y un valor numrico e inserte el nuevo nombre despus del n-esimo nombre y al final imprima la lista.

Eliminar un elemento As como existen tres formas de insertar un elemento, existen tres formas de eliminarlo. Eliminar un elemento al inicio de la lista

nodoSimple nodo, inicio = null, fin = null; String x; ... .. . x = inicio.obtenDato(); nodo = inicio; inicio = inicio.obtenEnlace(); nodo.cambiaEnlace(null); nodo = null;

70

Producto de Aprendizaje: 4. Elabore un programa en Java que lea 5 nombres desde el teclado, los inserte al inicio en una lista ligada simple e imprima la lista, posteriormente elimine el primer nombre e imprima la lista final.

Eliminar un elemento al final de la lista

nodoSimple nodo, inicio = null, fin = null; String x; ... .. . x = fin.obtenDato(); nodo = inicio; while (nodo.obtenEnlace() != fin) nodo = nodo.obtenEnlace(); nodo.cambiaEnlace(null); fin = nodo; Producto de Aprendizaje: 5. Elabore un programa en Java que lea 5 nombres desde el teclado, los inserte al final en una lista ligada simple e imprima la lista, posteriormente elimine el ultimo nombre e imprima la lista final.

Eliminar un elemento en medio de la lista

71

nodoSimple nodo, inicio = null, fin = null; String x; ... .. . x = nodo.obtenDato(); pre.cambiaEnlace(nodo.obtenEnlace); nodo.cambiaEnlace(null); nodo = null; Nota: En ninguno de los algoritmos anteriores, se a validado si la lista esta vaca o si existe un solo elemento en la lista. Producto de Aprendizaje: 6. Elabore un programa en Java que lea 5 nombres desde el teclado, los inserte al inicio en una lista ligada simple e imprima la lista, posteriormente solicite un nmero entre 1 al 5 y elimine el n-esimo nombre, al final imprima la lista.

Buscar un elemento
Al realizar la bsqueda un elemento en una lista, se debe realizar este proceso hasta que se localice el elemento o hasta que se llegar al final de la lista. boolean buscarL(nodoSimple nodo, String x) { while (nodo != null && !x.equals(nodo.obtenDato())) nodo = nodo.obtenEnlace(); if (nodo != null && x.equals(nodo.obtenDato())) return true; else return false; } nodoSimple buscarN(nodoSimple nodo, String x) { while (nodo != null && !x.equals(nodo.obtenDato())) nodo = nodo.obtenEnlace(); return nodo; } Producto de Aprendizaje: 7. Elabore un programa en Java que lea 5 nombres desde el teclado, los inserte al final en una lista ligada simple e imprima la lista, posteriormente solicite un nuevo nombre y lo busque en la lista, si encuentra el nombre indique en que posicin se encuentra, en caso de no localizarlo imprima -1.

72

Recorrer la lista
nodo = inicio; while (nodo != null) { System.out.print(nodo.ObtenDato() + "->"); nodo = nodo.obtenEnlace(); } Systema.out.println("/"); El siguiente programa solicita el nmero de elementos que se desea insertar en una lista, posteriormente mediante un men solicita la forma de insercin (Inicio o Final) y al final despliegue la lista en pantalla.
1 // Ejemplo_Lista 2 3 import javax.swing.JOptionPane; 4 5 class nodoSimple { 6 private String dato; 7 private nodoSimple enlace; 8 9 nodoSimple( String d ) { 10 this( d, null ); 11 } 12 13 nodoSimple( String d, nodoSimple e ) { 14 dato = new String(d); 15 enlace = e; 16 } 17 18 String obtenDato() { 19 return dato; 20 } 21 22 nodoSimple obtenEnlace() { 23 return enlace; 24 } 25 26 void cambiaDato(String d) { 27 dato = new String(d); 28 } 29 30 void cambiaEnlace(nodoSimple e) { 31 enlace = e; 32 } 33 } 34 Programa: Ejemplo_Lista.java

1/2

73

35 public class Ejemplo_Lista { 36 public static void main(String [] args) { 37 nodoSimple inicio = null, fin = null, nodo; 38 String inf = ""; 39 int cuantos, tipo=0; 40 Object[] options = { "Inicio", "Final" }; 41 42 cuantos = Integer.parseInt( 43 JOptionPane.showInputDialog("Cuantos elementos deseas:") ); 44 if (cuantos > 0) { 45 tipo = JOptionPane.showOptionDialog(null, 46 "Insertar al", "Opcin de insercin", 47 JOptionPane.DEFAULT_OPTION, 48 JOptionPane.QUESTION_MESSAGE, 49 null, options, options[0]); 50 51 for(int i=1; i<=cuantos; i++) { 52 inf = JOptionPane.showInputDialog 53 ("Dame el valor del nodo " + i + ":"); 54 nodo = new nodoSimple(inf); 55 if (i == 1) { 56 inicio = nodo; 57 fin = nodo; 58 } 59 else { 60 if (tipo==0) { 61 nodo.cambiaEnlace(inicio); 62 inicio = nodo; 63 } 64 else { 65 fin.cambiaEnlace(nodo); 66 fin = nodo; 67 } 68 } 69 } 70 71 String Salida = ""; 72 nodo = inicio; 73 while (nodo != null) { 74 Salida += nodo.obtenDato() + "->"; 75 nodo = nodo.obtenEnlace(); 76 } 77 Salida += "\\"; 78 JOptionPane.showMessageDialog( null,Salida, 79 "Lista ligada simple",JOptionPane.PLAIN_MESSAGE); 80 81 System.exit(0); 82 } 83 } 84 } Programa: Ejemplo_Lista.java

2/2

74

Insercin al inicio:

Insercin al final:

75

Producto de Aprendizaje: 8. Elabore un programa en Java que mediante un men despliegue si se quiere Insertar, Borrar, Mostrar o Salir en una lista ligada simple, si selecciona Insertar se despliegue un men que indique si se inserta al Inicio, en Medio o al Final de la lista, si selecciona en Medio, capture la posicin donde se desea insertar, despus teclee el nombre y lo inserte en la opcin indicada. Si selecciona Borrar se despliegue un men que indique si se borra al Inicio, en Medio o Final, si selecciona en Medio, capture la posicin del elemento a borrar y posteriormente borre el elemento segn lo indicado. Si selecciona Mostrar despliegue la lista ligada simple. Solo puede terminar cuando en el men principal seleccione Salir.

Listas doblemente ligadas Clase nodoDoble


class nodoDoble { private nodoDoble enlaceIzq; private String dato; private nodoDoble enlaceDer;

76

nodoDoble( String d ) { this( null, d, null ); } nodoDoble(nodoDoble izq, String d, nodoDoble der ) { dato = new String(d); enlaceIzq = izq; enlaceDer = der; } String obtenDato() { return dato; } nodoDoble obtenEnlaceIzq() { return enlaceIzq; } nodoDoble obtenEnlaceDer() { return enlaceDer; } void cambiaDato(String d) { dato = new String(d); } void cambiaEnlaceIzq( nodoDoble izq ) { enlaceIzq = izq; } void cambiaEnlaceDer( nodoDoble der ) { enlaceDer = der; } }

Insertar un elemento
Existen tres formas de insertar un nodo en una lista doblemente ligada: Insertar al inicio

77

nododoble nodo, inicio = null, fin = null; ... .. . Capturar la informacin nodo = new nodoDoble(informacin);

... .. . nodo.cambiaEnlaceDer(inicio); inicio.cambiaEnlaceIzq(nodo); inicio = nodo; Insertar al final

nodoDoble nodo, inicio = null, fin = null; ... .. .

Capturar la informacin nodo = new nodoDoble(informacin); ... .. . fin.cambiaEnlaceDer(nodo); nodo.cambiaEnlaceIzq(fin); fin = nodo;

78

Insertar entre elementos de la lista

nodoDoble nodo, inicio = null, fin = null; ... .. . Capturar la informacin nodo = new nodoDoble(informacin); ... .. . pre.cambiaEnlaceDer(nodo); nodo.cambiaEnlaceIzq(pre); nodo.cambiaEnlaceDer(suc); suc.cambiaEnlaceIzq(nodo);

Eliminar un elemento
Existen tres formas de eliminar un elemento en una lista doblemente ligada. Eliminar un elemento al inicio

79

nodoDoble nodo, inicio = null, fin = null; String x; ... .. . x = inicio.obtenDato(); nodo = inicio; inicio = inicio.obtenEnlaceDer(); inicio.cambiaEnlaceIzq(null); nodo.cambiaEnlaceDer(null); nodo = null; Eliminar un elemento al final de la lista

nodoDoble nodo, inicio = null, fin = null; String x;

... .. . x = fin.obtenDato(); nodo = fin; fin = fin.obtenEnlaceIzq(); fin.cambiaEnlaceIzq(null); nodo.cambiaEnlaceIzq(nell); nodo = null;

80

Eliminar un elemento en medio

nodoDoble nodo, inicio = null, fin = null; String x; ... .. . x = nodo.obtenDato(); pre.cambiaEnlaceDer(suc); suc.cambiaEnlaceIzq(pre); nodo.cambiaEnlaceIzq(null); nodo.cambiaEnlaceDer(null); nodo = null; Producto de Aprendizaje: 9. Elabore un programa en Java que mediante un men despliegue si se quiere Insertar, Borrar, Mostrar o Salir en una lista doblemente ligada, si selecciona Insertar se despliegue un men que indique si se inserta al Inicio, en Medio o al Final de la lista, si selecciona en Medio, capture la posicin donde se desea insertar, despus teclee el nombre y lo inserte en la opcin indicada. Si selecciona Borrar se despliegue un men que indique si se borra al Inicio, en Medio o Final, si selecciona en Medio, capture la posicin del elemento a borrar y posteriormente borre el elemento segn lo indicado. Si selecciona Mostrar despliegue la lista ligada simple. Solo puede terminar cuando en el men principal seleccione Salir.

Clase LinkedList

El paquete java.util contiene la clase LinkedList para implementar y manipular listas enlazadas que crezcan y se reduzcan durante la ejecucin del programa. La clase LinkedList es una implementacin de listas doblemente ligadas.

81

Mtodos LinkedList() void add(int index, Object o) boolean add(Object o) void addFirst(Object o) void addLast(Object o) void clear() boolean contains(Object o)

Descripcin Crea una lista vacia Inserta el objeto o en la posicin indicada por index Inserta el objeto o al final de la lista Inserta el objeto o al inicio de la lista Inserta el objeto o al final de la lista Elimina todos los elementos Regresa verdadero si el objeto o esta contenido en la lista Regresa el objeto almacenado en la posicin indicada por index Regresa el objeto que esta al inicio de la lista Regresa el objeto que esta al final de la lista Regresa la posicin de la primera ocurrencia del objeto o en la lista o -1 en caso de que no exista el elemento. Regresa la posicin de la ultima ocurrencia del objeto o en la lista o -1 en caso de que no exista el elemento Elimina y regresa el objeto indicado por index Elimina la primera ocurrencia del objeto o de la lista.

Object get(int index)

Object getFirst()

Object getLast()

int indexOf(Object o)

int lastIndexOf(Object o)

Object remove(int index)

boolena remove(Object o)

82

Mtodos Object removeFirst()

Descripcin Elimina y regresa el primer elemento de la lista Elimina y regresa el ultimo elemento de la lista Remplaza el elemento indicado por index por el elemento o y regresa el objeto almacenado en esa posicin Regresa el numero de elementos e la lista Regresa un arreglo de objetos que contiene todos los elementos de lista

Object removeLast()

Object set(int index, Object o)

int size()

Object [ ] toArray() Producto de Aprendizaje: 10.

Utilizando la clase LinkedList, elabore un programa en Java que mediante un men despliegue si se quiere Insertar, Borrar, Mostrar o Salir en una lista doblemente ligada, si selecciona Insertar se despliegue un men que indique si se inserta al Inicio, en Medio o al Final de la lista, si selecciona en Medio, capture la posicin donde se desea insertar, despus teclee el nombre y lo inserte en la opcin indicada. Si selecciona Borrar se despliegue un men que indique si se borra al Inicio, en Medio o Final, si selecciona en Medio, capture la posicin del elemento a borrar y posteriormente borre el elemento segn lo indicado. Si selecciona Mostrar despliegue la lista ligada simple. Solo puede terminar cuando en el men principal seleccione Salir.

83

Vous aimerez peut-être aussi