Programación de Sistemas - · PDF fileelse return -1;} 25. ... •Inserción y...

27
Listas enlazadas Programación de Sistemas 1

Transcript of Programación de Sistemas - · PDF fileelse return -1;} 25. ... •Inserción y...

Page 1: Programación de Sistemas - · PDF fileelse return -1;} 25. ... •Inserción y extracción de nodos con coste independiente del tamaño de la lista •Concatenación y partición

Listas enlazadas

Programación de Sistemas

1

Page 2: Programación de Sistemas - · PDF fileelse return -1;} 25. ... •Inserción y extracción de nodos con coste independiente del tamaño de la lista •Concatenación y partición

Estructuras de datos

• Abstracción que representa un conjunto de datos en un programa con el objeto de facilitar su manipulación

• Diferentes estructuras de datos presentan ventajas o desventajas dependiendo de la naturaleza de los datos y los tipos de manipulaciones que se necesite hacer sobre los mismos

2

Page 3: Programación de Sistemas - · PDF fileelse return -1;} 25. ... •Inserción y extracción de nodos con coste independiente del tamaño de la lista •Concatenación y partición

Estructuras de datos lineales

• Organizan los datos en secuencia, donde cada dato se relaciona con un dato anterior (excepto el primero) y un dato posterior (excepto el último)

• Ejemplos de estructuras de datos lineales:

– Arrays

– Listas enlazadas

– Pilas

– Colas

– Colas dobles

3

Page 4: Programación de Sistemas - · PDF fileelse return -1;} 25. ... •Inserción y extracción de nodos con coste independiente del tamaño de la lista •Concatenación y partición

Arrays

• Los arrays presentan dos grandes ventajas para el almacenamiento de colecciones lineales de datos:

– Acceso aleatorio: se puede acceder a cualquier posición del array en tiempo constante.

– Uso eficiente de memoria cuando todas las posiciones están ocupadas: por guardarse en posiciones consecutivas de memoria.

4

Page 5: Programación de Sistemas - · PDF fileelse return -1;} 25. ... •Inserción y extracción de nodos con coste independiente del tamaño de la lista •Concatenación y partición

Arrays

• Desventajas:

– Tamaño estático: debe asignarse un tamaño al crear el array, y no se puede cambiar. Da lugar a problemas:

• Uso no eficiente de memoria por tener que reservar espacio para el caso peor

• Posibilidad de sobrepasar el tamaño reservado en tiempo de ejecución

– Necesidad de memoria contigua:

• Puede ocurrir que, pese a haber suficiente memoria libre, no haya un bloque contiguo suficientemente grande

5

Page 6: Programación de Sistemas - · PDF fileelse return -1;} 25. ... •Inserción y extracción de nodos con coste independiente del tamaño de la lista •Concatenación y partición

Arrays

• Desventajas:

– Ciertas operaciones tienen un coste no óptimo:

• Inserciones y eliminaciones de datos en la primera posición o posiciones intermedias: necesidad de desplazar datos entre posiciones consecutivas.

• Concatenación de dos o más arrays: necesidad de copiar los datos a un nuevo array.

• Partición de un array en varios fragmentos: necesidad de copiar datos a nuevos arrays.

6

Page 7: Programación de Sistemas - · PDF fileelse return -1;} 25. ... •Inserción y extracción de nodos con coste independiente del tamaño de la lista •Concatenación y partición

Listas enlazadas

• Secuencia ordenada de nodos donde cada nodo almacena:

– Un dato

– Una referencia al siguiente nodo

• Los nodos no tienen por qué estar contiguos en memoria

first

info

next

info

next

info

next null7

Page 8: Programación de Sistemas - · PDF fileelse return -1;} 25. ... •Inserción y extracción de nodos con coste independiente del tamaño de la lista •Concatenación y partición

La clase Node

Public class Node {

private Object info;

private Node next;

public Node(Object info) {…}

public Node getNext() {…}

public void setNext(Node next) {…}

public Object getInfo() {…}

public void setInfo(Object info) {…}

}

8

Page 9: Programación de Sistemas - · PDF fileelse return -1;} 25. ... •Inserción y extracción de nodos con coste independiente del tamaño de la lista •Concatenación y partición

Inserción al principio

first

null

newNode

Node newNode = new Node(info);

null

9

Page 10: Programación de Sistemas - · PDF fileelse return -1;} 25. ... •Inserción y extracción de nodos con coste independiente del tamaño de la lista •Concatenación y partición

Inserción al principio

first

newNode

newNode .setNext(first);

null

10

Page 11: Programación de Sistemas - · PDF fileelse return -1;} 25. ... •Inserción y extracción de nodos con coste independiente del tamaño de la lista •Concatenación y partición

Inserción al principio

first

newNode

first = newNode;

null

11

Page 12: Programación de Sistemas - · PDF fileelse return -1;} 25. ... •Inserción y extracción de nodos con coste independiente del tamaño de la lista •Concatenación y partición

Extracción del primer nodo

first

null

12

Page 13: Programación de Sistemas - · PDF fileelse return -1;} 25. ... •Inserción y extracción de nodos con coste independiente del tamaño de la lista •Concatenación y partición

Extracción del primer nodo

first

data

Object data = first.getInfo();

null

13

Page 14: Programación de Sistemas - · PDF fileelse return -1;} 25. ... •Inserción y extracción de nodos con coste independiente del tamaño de la lista •Concatenación y partición

Extracción del primer nodofirst

data

first = first.getNext();

null

14

Page 15: Programación de Sistemas - · PDF fileelse return -1;} 25. ... •Inserción y extracción de nodos con coste independiente del tamaño de la lista •Concatenación y partición

Extracción del primer datofirst

data

null

15

Page 16: Programación de Sistemas - · PDF fileelse return -1;} 25. ... •Inserción y extracción de nodos con coste independiente del tamaño de la lista •Concatenación y partición

Inserción en un punto intermedio

first

null

newNode

Node newNode = new Node(info);

previous

null

16

Page 17: Programación de Sistemas - · PDF fileelse return -1;} 25. ... •Inserción y extracción de nodos con coste independiente del tamaño de la lista •Concatenación y partición

Inserción en un punto intermedio

first

newNode

newNode.setNext(previous.getNext())

previous

null

17

Page 18: Programación de Sistemas - · PDF fileelse return -1;} 25. ... •Inserción y extracción de nodos con coste independiente del tamaño de la lista •Concatenación y partición

Inserción en un punto intermedio

first

newNode

previous.setNext(newNode)

previous

null

18

Page 19: Programación de Sistemas - · PDF fileelse return -1;} 25. ... •Inserción y extracción de nodos con coste independiente del tamaño de la lista •Concatenación y partición

Eliminación de un dato intermedio

first

null

previous

19

Page 20: Programación de Sistemas - · PDF fileelse return -1;} 25. ... •Inserción y extracción de nodos con coste independiente del tamaño de la lista •Concatenación y partición

Eliminación de un dato intermedio

first

null

previous data

20

Object data = previous.getNext().getInfo();

Page 21: Programación de Sistemas - · PDF fileelse return -1;} 25. ... •Inserción y extracción de nodos con coste independiente del tamaño de la lista •Concatenación y partición

Eliminación de un dato intermedio

first

null

previous

previous.setNext(previous.getNext().getNext())

data

21

Page 22: Programación de Sistemas - · PDF fileelse return -1;} 25. ... •Inserción y extracción de nodos con coste independiente del tamaño de la lista •Concatenación y partición

Eliminación de un dato intermedio

first

null

previous data

22

Page 23: Programación de Sistemas - · PDF fileelse return -1;} 25. ... •Inserción y extracción de nodos con coste independiente del tamaño de la lista •Concatenación y partición

Recorrido de la lista

first

null

current

Node current = first;

while (current != null) {

current = current.getNext();

}

23

Page 24: Programación de Sistemas - · PDF fileelse return -1;} 25. ... •Inserción y extracción de nodos con coste independiente del tamaño de la lista •Concatenación y partición

Recorrido: buscar el último nodo

• Se avanza una referencia hasta localizar un nodo cuyo siguiente sea null:

public Node searchLastNode() {

Node last = null;

Node current = first;

if (current != null) {

while (current.getNext() != null) {

current = current.getNext();

}

last = current;

}

return last;

}

24

Page 25: Programación de Sistemas - · PDF fileelse return -1;} 25. ... •Inserción y extracción de nodos con coste independiente del tamaño de la lista •Concatenación y partición

Recorrido: buscar posición de un dato

• Se avanza una referencia hasta localizar el dato. Se va incrementando un contador al mismo tiempo:

public int search(Object info) {

int pos = 1;

Node current = first;

while (current != null

&& !current.getInfo().equals(info)) {

pos += 1;

current = current.getNext();

}

if (current != null)

return pos;

else

return -1;

}25

Page 26: Programación de Sistemas - · PDF fileelse return -1;} 25. ... •Inserción y extracción de nodos con coste independiente del tamaño de la lista •Concatenación y partición

Ventajas de las listas enlazadas

• Inserción y extracción de nodos con coste independiente del tamaño de la lista

• Concatenación y partición listas con coste independiente del tamaño de las listas

• No hay necesidad de grandes cantidades de memoria contigua

• El uso de memoria se adapta dinámicamente al número de datos almacenados en la lista en cada momento

26

Page 27: Programación de Sistemas - · PDF fileelse return -1;} 25. ... •Inserción y extracción de nodos con coste independiente del tamaño de la lista •Concatenación y partición

Desventajas de las listas enlazadas

• Acceso a posiciones intermedias con coste dependiente del tamaño de la lista

• Necesidad de memoria adicional para almacenar los objetos Node con sus atributos

27