Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Listas Enlazadas Simples
Listas Enlazadas Simples
PROGRAMACION II
Agenda
• Conceptos
• Implementación
• Modelo de Listas
• Algoritmos Básicos
1
17/10/2019
Definición
• Estructura de datos lineal.
• Colección de elementos homogéneos entre los que
existe una relación lineal
Para cada elemento, se puede decir cuál es su sucesor (en
caso de existir).
Cada elemento de la lista, a excepción del primero, tiene un
único predecesor
Cada elemento de la lista, a excepción del último, tiene un
único sucesor
• Colección de nodos enlazados entre sí
Lista
Nodo1 Nodo2 Nodo n
Ejemplo
2
17/10/2019
Clasificación de Listas
• Por la naturaleza de la información:
Ordinales: la posición de los elementos en la estructura la
determina su orden de llegada.
Calificadas: Cada elemento de la lista se identifica por un valor
único (clave). En función de que exista o no relación entre la
clave y la posición pueden ser: no ordenadas y ordenadas.
• Por la forma de ocupar el espacio físico:
Listas densas: la posición de un elemento es:
1 si es el primer elemento.
n si el elemento anterior es n-1.
Listas enlazadas: la posición de un elemento es:
k si es el primer elemento, siendo k conocido.
j si no es el primer elemento, posición contenida en el elemento
anterior.
• Por el tipo de tecnología:
En memoria central: estáticas y dinámicas.
En memoria externa (no se contemplan en la asignatura).
Implementación de Listas
• Una lista es independiente de una forma específica de codificación
• Pueden usarse:
Estructuras Estáticas (matrices)
Estructura Dinámica (tecnología de punteros / referencias)
3
17/10/2019
• Lista enlazada:
Lista 10 12 13 21
4
17/10/2019
• Lista:
Variable estática que apunta al primer elemento de una lista.
• Valores especiales:
Primer elemento de la lista
Último elemento de la lista
Memoria estática
Lista
10 Memoria dinámica
12
21 *
13
10
5
17/10/2019
Otras posibilidades
Con cabecera y/o centinela.
Circulares.
11
Modelo.
Lista
Memoria estática
Memoria dinámica
inicio
nombre
NodoLista 10
12
n
21 u
l
13 l
12
6
17/10/2019
13
• Código:
class NodoLista {
int clave;
NodoLista sig;
14
7
17/10/2019
Algoritmos básicos.
• Una sola ejecución:
Insertar al principio.
Eliminar el primero.
15
lista
• Insertar al principio.
Crear nuevo nodo con la información de 13
inicio
nombre 10
entrada
NodoLista
Enlazar el nuevo nodo a la lista
null
21
aux
dato
16
8
17/10/2019
Situación final.
17
null
Variable lista
nombre
Variable lista
Objeto de clase Lista
null
nombre 10
} Variable lista
Objeto de clase Lista Objeto de clase NodoLista
18
9
17/10/2019
Proceso único.
• Eliminar el primero.
Lista
lista
13
inicio
static void eliminarPrimero (Lista lista) { nombre 10
if (lista.inicio != null)
NodoLista
lista.inicio = lista.inicio.sig;
else System.out.println ("Error, lista vacia");
} 21 null
19
20
10
17/10/2019
21
if (nodoLista != null)
else {
return resul;
}
22
11
17/10/2019
null
8 resul
8
dato null
nodoLista
8 resul
Instancia 2
dato
nodoLista
null
4
Instancia 1 8 resul
dato
nodoLista 2
lanzadera 8
inicio
dato nombre
lista
23
2 4
inicio
nombre
NodoLista
Fase de transición.
null
resul
8 Instancia 3
Lista
inicio
null
nombre
2 4
NodoLista
Fase de vuelta.
null
Instancia 1 Instancia 2 8
Lista
null
2 4
inicio
nombre
NodoLista
24
12
17/10/2019
25
if (nodoListaO != null) {
resul = duplicarLista (nodoListaO.sig);
aux = new NodoLista (nodoListaO.clave);
aux.sig = resul;
resul = aux;
}
else resul = null;
return resul;
}
26
13
17/10/2019
Ejercicio Resuelto
• La Facultad de Ingenierías decidió implementar un parqueadero para estudiantes, el diseño
contempla un solo carril que acepta hasta 10 automóviles, los automóviles llegan por el
extremo sur del estacionamiento y salen por el extremo norte.
• Si llega un estudiante a recoger un carro, que no está en el extremo norte, se sacan todos los
automóviles de ese lado, se retira el carro y los otros carros se restablecen en el orden en que
estaban.
• Cada vez que sale un automóvil, los carros del extremo sur se mueven hacia adelante para
que, en toda ocasión, los espacios vacíos queden en el extremo sur.
• Escriba un programa en Java que procese un grupo de líneas de entrada, cada línea de
entrada contiene una E para llegada o una S para salida y un numero de placa.
• Se supone que los carros llegan y salen en el orden especificado en la entrada. El programa
debe imprimir un mensaje cada vez que llega o sale un auto.
• Cuando llega el carro debe especificar (el mensaje) si hay espacio o no para el mismo en el
estacionamiento. Si no hay espacio, el carro espera hasta que haya espacio o hasta que se lee
una línea de salida, cuando sale un carro, el mensaje debe incluir la cantidad de veces que se
ha movido del estacionamiento, incluyendo la salida pero no la llegada.
27
28
14
17/10/2019
29
30
15
17/10/2019
Interface ArrayList
• Acceso posicional eficiente
• Cuando se supera el tamaño del array, se crea uno nuevo más grande y se copian en
él los elementos del antiguo
31
Interface ArrayList
• De forma general un ArrayList en Java se crea de la siguiente forma:
ArrayList nombreArray = new ArrayList();
• Por ejemplo:
ArrayList a = new ArrayList();
a.add("Lenguaje");
a.add(3);
a.add('a');
a.add(23.5);
32
16
17/10/2019
Interface ArrayList
NOMBRE
PARÁMETROS DESCRIPCIÓN VALOR RETORNADO
MÉTODO
add Elemento a Añade un elemento a el ArrayList. Booleano, indicando el estado de
insertar. Añade desde el final. la operación.
remove Índice a borrar. Borra un elemento del ArrayList. Booleano, indicando el estado de
la operación.
clear Ninguno Limpia el ArrayList de elementos. Ninguno
size Ninguno Devuelve el número de elementos Cantidad de elementos en el
ArrayList
get Índice del elemento Devuelve el elemento en el índice Elemento en el índice indicado
queremos indicado
33
Ejercicio Resuelto
• Uso de ArrayList para implementar colección de música (CDs)
34
17
17/10/2019
Interface LinkedList
• Acceso posicional costoso
• Tamaño ilimitado
35
Interface LinkedList
• Lista doblemente enlazada
La clase LinkedList implementa la interface List. Eso quiere decir que tendrá una
serie de métodos propios de esta interface y comunes a todas las
implementaciones. Así utilizando siempre que se pueda declaración de objetos del
tipo definido por la interface podemos cambiar de forma relativamente fácil su
implementación (por ejemplo pasar de ArrayList a LinkedList y viceversa) y
conseguir mejoras en el rendimiento de nuestros programas con poco esfuerzo.
Ahora centrándonos en la clase LinkedList, ésta se basa en la implementación de
listas doblemente enlazadas. Esto quiere decir que la estructura es un poco más
compleja que la implementación con ArrayList
36
18
17/10/2019
Interface LinkedList
• Metodos específicos de LinkedList
37
Ejercicio Propuesto
• Crear una clase denominada ListaMuertosGoT que al ser inicializada contenga
un LinkedList con tres Strings que sean personajes de GoT (Game of Thrones)
que ya hayan muerto en la serie.
• Crear una clase test con el método main que inicialice un objeto
ListaMuertosGoT, pida dos personaje muertos más al usuario, los añada a la
lista y muestre el contenido de la lista por pantalla
• Por cada personaje debe tenerse:
Nombre
Edad (aproximada) en que falleció
Forma en que falleció
38
19