Professional Documents
Culture Documents
Listas enlazadas
Lista
primero ltimo
Enlace 1
Enlace 2
...
Enlace n
null
Elem 1
Elem 2
Elem n
private static class SLink { String item; SLink next; SLink( String o, SLink n ) { item = o; next = n; } SLink( Object o ) { this( o, null ); } } public void addFirst( String o );
11
12
removeFirst()
public Object removeFirst() throws NoSuchElementException { if ( first == null ) // si la lista est vaca throw new NoSuchElementException(); else { SLink t = first; first = first.next; // si la lista tena 1 elemento y ahora est vaca if ( first == null ) last = null; length--; return t.item; } }
15
removeFirst(), antes
Lista
primero ltimo
Enlace 1
Enlace 2
...
Enlace n
null
Elem 1
Elem 2
Elem n
16
removeFirst(), despus
Lista
primero ltimo
Enlace 1
Enlace 2
...
Enlace n
null
Elem 1
Elem 2
Elem n
17
despus
Lista
primero ltimo
Enlace 1
null
Enlace 1
null
Elem 1
Elem 1
18
addFirst(Object o)
public void addFirst(Object { if ( first == null ) { first = last = new } else { first = new SLink( } length++; }
19
o, first );
addFirst(), despus
Lista
primero ltimo
Enlace 1
...
Enlace n
null
Elem 1
Elem n
20
10
addFirst(), despus
Lista
primero ltimo
Enlace 0
Enlace 1
...
Enlace n
null
Elem 0
Elem 1
Elem n
21
despus
Lista
primero ltimo
null
Enlace 1
null
Elem 1
22
11
12
25
26
13
Si crea su propia clase de lista, podr realizar estas operaciones dentro de ella, pero el enfoque no sera general. Un segundo enfoque est basado en el nmero o el ndice de las posiciones de la lista.
28
14
Listas indexadas
Entonces podramos agregar dos mtodos
public Object get( int n ) throws NoSuchElementException; public void insert( Object o, int n ) throws NoSuchElementException;
El siguiente bloque de cdigo recorrer una lista indexada, por ejemplo, myList:
for ( int i = 0; i < myList.size(); i++ ) { Object o = myList.get( i ); . . . }
29
Listas indexadas, 2
Las listas implementadas con arrays (como Java Vector) suelen incluir estos mtodos, ya que son fciles de implementar. Ahora bien, la idea de utilizar un ndice para acceder a los miembros de la lista puede ocasionar problemas.
Como el ndice depende de la posicin ordinal, cambiar cada vez que se agrega o elimina un elemento de la lista. Si la lista no est implementada sobre una estructura de datos indexada como un array, el acceso al elemento indexado puede ser lento.
En la vida real, cuando utilizamos listas grandes como directorios telefnicos, no tenemos en cuenta el ndice de una entrada, sino su posicin relativa.
30
15
Iteradores
Un iterador es una clase de ayuda que se utiliza con un List o con otra clase de coleccin. Cuenta con mtodos para devolver los miembros de la coleccin de uno en uno. Los iteradores tambin pueden implementar mtodos que permitan modificar la coleccin con relacin a la posicin actual del iterador.
31
Interfaz ListIterator
public interface ListIterator { public boolean hasNext(); public Object next() throws NoSuchElementException; public void remove() throws IllegalStateException; public void add( Object o ); public void set( Object o ) throws IllegalStateException }
32
16
Mtodos de iteradores
El tipo de iterador que presentamos aqu devuelve un nuevo elemento y avanza hasta el siguiente con la misma operacin next(). No hay forma de volver atrs con esta interfaz. ListIterator de Java permite ir hacia delante y hacia atrs. El elemento ms reciente devuelto por next() es el elemento actual. remove() eliminar el elemento actual de la coleccin subyacente . set() lo modificar. add() insertar un nuevo elemento tras el elemento actual y delante del elemento que se devolvera en la siguiente llamada a next(). Tras llamar a add(), el elemento insertado pasa a ser el nuevo elemento actual. Una llamada a next() devolver el elemento ubicado despus del insertado. La primera llamada a next() debera devolver el primer elemento de la lista.
33
17
Un iterador en accin
Nuevo iterador verde rojo violeta naranja current sin definir Tras la 1 llamada a next() verde rojo violeta naranja current es verde
current es negro
Tras 2 llamada a next() current es rojo verde negro rojo violeta naranja
36
18
Un iterador en accin, 2
Tras llamar a remove() verde negro violeta naranja current sin definir
37
19
doubleList() est actualmente vaco. Escriba una implementacin para doubleList() que obtenga un iterador para la lista, l, y que doble cada Integer de la misma. Probablemente querr utilizar el mtodo intValue() de Integer. Complelo y prubelo.
39
20
21