igor santos grueiro. ya conocemos las listas listas de amigos

Post on 16-Apr-2015

9 Views

Category:

Documents

2 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Programación IIListas

Igor Santos Grueiro

Ya conocemos las

listas

Listas de amigos

Listas de compras

¿Qué es una lista?

Una lista es un conjunto de elementos homogéneo que cumple:

El orden relativo de estos elementos es significativo

(1,2,3) (1,3,2)!=

Pueden haber elementos repetidos

(1,2,2,2,2,2,2,3)

Ya sabemos utilizar la

lista enlazada

Pero, ¿cómo se implementa por dentro?

Una lista se puede construir:

De forma estática De forma dinámica

Una lista se puede implementar de forma estática mediante un array

Tiene una única ventaja:permite el acceso directo a un

elemento

Tiene múltiples desventajas

El tamaño de la lista tiene que ser fijo y conocido en

tiempo de compilación 1

En las inserciones y borrados, hay que provocar un

desplazamiento de elementos que repercute en el tiempo de

ejecución2

Se desaprovecha el espacio de la memoria real, en el caso de lista

cortas3

ArrayList en java

Para una lista dinámica, de nuevo

Object elementoNodo siguiente

Nodo

public class NodoListaEnlazadaSimple {

private Object elemento;private NodoListaEnlazadaSimple siguiente;

}

}

Tiene los siguientes atributos

}

Un nodo se puede crear de varias formas

Se puede crear vacío1

public NodoListaEnlazadaSimple(){this.elemento = null;this.siguiente = null;

}

null

Se puede crear con un objeto dentro2

public NodoListaEnlazadaSimple(Object x) {this.elemento = x;this.siguiente = null;

}

x

Se puede crear con un objeto dentro y un enlace a

otro nodo3public NodoListaEnlazadaSimple(Object x,

NodoListaEnlazadaSimple sig) {this.elemento = x;

this.siguiente = sig;}

XNodo siguiente

}

Getters y Setters para el valor del objeto y para el nodo siguiente

}

Podemos insertar un nodo siguiente

al nodo

public void insertarSig(Object x){NodoListaEnlazadaSimple nuevoNodo = new

NodoListaEnlazadaSimple();nuevoNodo.elemento = x;nuevoNodo.siguiente = this.siguiente;this.siguiente = nuevoNodo;

}

elementosiguiente

X

}

Podemos borrar el siguiente nodo

public void borrarSig(){this.siguiente = this.siguiente.siguiente;

}

Ahora la clase

ListaEnlazadaSimple

public class ListaEnlazadaSimple {

private NodoListaEnlazadaSimple primero;

private NodoListaEnlazadaSimple recorrido;

private int tamanyo;

public ListaEnlazadaSimple(){this.primero = null;this.recorrido = null;this.tamanyo = 0;

}}

}

//…public void vaciar(){

this.primero = null;this.recorrido = null;this.tamanyo = 0;

}//…

Para vaciar el primer nodo y el recorrido a null

//…public boolean estaVacia (){

return (this.primero == null);}//…

Para comprobar si una lista está vacía comprobamos si

el primero es null

//…public int tamanyo(){

return tamanyo;}//…

También, podemos recuperar el número de elementos

insertados en la lista

public Object cima(){ return v[cont-1]; }

//…public void insertarPrimero(Object x) {

primero = new NodoListaEnlazadaSimple(x, primero);

this.tamanyo++;}//…

Podemos insertar un objeto en la primera posición de la lista

public Object cima(){ return v[cont-1]; }

Primero Cima

x

//…private NodoListaEnlazadaSimple

devuelvePos(int pos) {NodoListaEnlazadaSimple temp =

primero;for (int i = 1; i <= pos; i++) {

temp = temp.getSiguiente();}return temp;

}//…

Necesitaremos acceder al nodo en cierta posición de la lista

public Object cima(){ return v[cont-1]; }

//…public void insertarPos(Object x, int pos) {

if (pos == 0)primero = new NodoListaEnlazadaSimple(x, primero);

elsedevuelvePos(pos - 1).insertarSig(x);

tamanyo++;}//…

Para insertar un objeto en cierta posición de la lista

public Object cima(){ return v[cont-1]; }

elementosiguiente

X

Primero Cima Pos 1

//…public void modificarPos(Object x, int pos) {

NodoListaEnlazadaSimple temp = devuelvePos(pos);

temp.setElemento(x);}//…

Para modificar un objeto en cierta posición de la lista

public Object cima(){ return v[cont-1]; }

//…public void borrarPos(int pos) {

if (pos == 0)primero = primero.getSiguiente();

else {NodoListaEnlazadaSimple temp =

devuelvePos(pos - 1);temp.borrarSig();

}tamanyo--;

}//…

Para borrar un objeto en cierta posición de la lista

public Object cima(){ return v[cont-1]; }

Primero Cima Pos 1

//…public void borrar(Object x) {

NodoListaEnlazadaSimple ant = null;NodoListaEnlazadaSimple temp = primero;while ((temp != null) && (!temp.getElemento().equals(x))) {

ant = temp;temp = temp.getSiguiente();

}if (temp != null) {

if (temp == primero)primero = temp.getSiguiente();

elseant.setSiguiente(temp.getSiguiente());

tamanyo--;}

}//…

Para borrar un objeto específico de la lista

public Object cima(){ return v[cont-1]; }

//…public Object extraerPos(int pos) {

return devuelvePos(pos).getElemento();}//…

Podemos devolver un elemento en cierta posición

public Object cima(){ return v[cont-1]; }

//…public int buscar(Object x) {

int i = 0;NodoListaEnlazadaSimple temp = primero;while ((i < tamanyo) && (!temp.getElemento().equals(x))) {

temp = temp.getSiguiente();i++;

}if (i >= tamanyo)

return -1;else

return i;}//…

Para buscar un objeto específico de la lista

public Object cima(){ return v[cont-1]; }

Las operaciones de recorrido

//…public void inicioRecorrido() {

recorrido = primero;}//…

Podemos iniciar un recorrido por la lista

public Object cima(){ return v[cont-1]; }

//…public Object getElemento() {

Object x = recorrido.getElemento();recorrido = recorrido.getSiguiente();return x;

}//…

Podemos seguir avanzando por la lista

public Object cima(){ return v[cont-1]; }

//…public boolean finRecorrido() {

return (recorrido == null);}//…

Podemos saber si hemos acabado el recorrido

public Object cima(){ return v[cont-1]; }

Ésta es la lista

simplemente enlazada

Cada nodo tiene 1 enlace

Pero hay más listas …

Cada nodo tiene 2 enlaces

Listas doblemente enlazadas

Optimizan la inserción por el medio de la lista

Podemos mejorar la inserción al final añadiendo una referencia al

nodo final

Lista con inserción por el final

Primero Último

Y aún hay más

Listas circularesPueden ser simplemente o doblemente enlazadas

Ejercicio

Realizar listas:Simplemente enlazadaSimplemente enlazada con inserción al final

:

top related