SlideShare a Scribd company logo
1 of 21
Download to read offline
Clase 25

           Listas enlazadas




  Colección de clases de Java
• El paquete java.util contiene implementaciones
  de muchas de las estructuras de datos que vamos
  a tratar y que implementaremos de forma más
  sencilla en clase.
• Puede utilizar las implementaciones estándar de
  Java en los boletines de problemas. Están más
  elaboradas y son más abstractas que las implemen-
  taciones de clase.
• Al aprender a implementar varias estructuras de
  datos, profundizará en el modo en que utiliza todas
  las estructuras.

                                                  2




                                                        1
Listas como un tipo de datos abstracto
Una lista es un conjunto de elementos con un
orden concreto:
     – Puede tener una longitud arbitraria.
     – Ofrece la posibilidad de insertar o
       eliminar un elemento en cualquier
       ubicación.
     – Ofrece la posibilidad de recorrer la lista de
       forma ordenada, de elemento en elemento.




                                                       3




              Una interfaz List
public interface List {
    public   boolean isEmpty();
    public   void addFirst( Object o );
    public   void addLast( Object o );
    public   boolean contains(Object o);
    public   boolean remove(Object o);
    public   Object removeFirst()
      throws NoSuchElementException;
    public void clear();
    public int size();
}

                                                       4




                                                           2
Estrategias de implementación de listas

• Existen muchas formas de implementar una lista.
• En implementaciones basadas en arrays
  como el Vector de Java, insertar un
  elemento en cualquier lugar que no sea el
  final de la lista puede ser complejo, ya que todos
  los elementos que se encuentran entre el punto de
  inserción y el final de la lista deberán desplazarse
  una posición para dejar hueco para la nueva
  entrada. Ocurre algo similar con la eliminación.
• Por ello, las listas suelen utilizar una
  implementación enlazada.                        5




   Listas enlazadas sencillas
• Las listas enlazadas son como trenes de mercancías.
• Cada elemento que que se va a poner en la lista está
  contenido en una instancia de un nuevo tipo de
  objeto, llamado enlace, que equivale a un vagón
  del tren.
• En una lista enlazada sencilla, el enlace no sólo
  contiene el elemento de la lista, sino que
  también apunta al siguiente elemento de la
  lista, al igual que un vagón de mercancías está
  acoplado al siguiente.
• El último enlace de la lista no apunta a nada.


                                                  6




                                                         3
Diagrama de lista enlazada sencilla


     Lista

 primero   último




     Enlace 1       Enlace 2   ...   Enlace n   null




     Elem 1         Elem 2           Elem n



                                                       7




  Listas enlazadas sencillas, 2
• El objeto de la lista, en sí mismo, apunta al
  enlace que contiene el primer elemento
  mostrado y suele incluir una referencia adicional
  al último enlace de la lista para facilitar la
  incorporación de elementos.
• Se dice que un enlace “contiene o “apunta a ,
  y que la instancia de la lista “apunta o
  “contiene un puntero . En Java, todos ellos son
  sinónimos de contener una referencia.
• Así, el enlace realmente no contiene el elemento,
  sino una referencia que señala al elemento
  de la lista.
• El último enlace contiene una referencia null en
  el campo que apunta al siguiente elemento.
                                                       8




                                                           4
Demostración de una lista enlazada sencilla


  List:                  Interfaz de lista
  SLinkedList:           Implementación de lista
  SLinkedListApp:         Aplicación main()
  SLinkedListView:       GUI de lista




                                                    9




     La clase interna de enlace
  public class SLinkedList implements List {
    private static class SLink
    {
      Object item;
      SLink next;

      SLink( Object o, SLink n )
      { item = o; next = n; }

      SLink( Object o )
      { this( o, null ); }
    }
    . . .
                                                   10




                                                        5
Listas genéricas y tipadas
•   La interfaz List que hemos especificado es general, como la clase
    Vector de Java: almacena y recuperar objetos.
•   Si crea su propia clase de tipo lista y sa be, por ejemplo, que sólo
    trabajar á concadenas, puede sustituir lo s campo s Object
    por cam pos String. P or ejemp lo:

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




Miembros de datos de SLinkedList

• Sólo es necesario first (primero).
• last (último) y length (longitud) se pueden
  encontrar al recorrer la lista, pero si se
  conservan y se actualizan estos miembros, la
  llamada a size() y a append() es mucho más
  rápida.
private int length = 0;
private SLink first = null;
private SLink last = null;



                                                                  12




                                                                           6
== y el método Object equals

• contains( Object o ) y remove( Object o ) deben
  buscar Object o en la lista. P ero, ¿q ué impli ca
  encontrarlo?
• ¿Debe contener la lista una referencia al objeto idéntico
  (==)? ¿O basta con que contenga una referencia a un objeto
  equivalente pero posiblemente distinto?

static private boolean
   objectEquals( Object a, Object b )
{
       if ( a == null )
         return ( b == null );
       else
         return a.equals( b );
 }
13




  Atención a los casos especiales

• Lo difícil al implementar una lista enlazada no es
  implementar el caso habitual para cada método,
  por ejemplo, eliminar un objeto de la mitad de la
  lista.
• Lo complicado es comprobar que los métodos
  también funcionen en casos excepcionales y
  ambiguos.
• Para cada método, debe pensar en si la
  implementación funcionará en los
  siguientes casos
   – en una lista vacía,
   – en una lista con uno o dos elementos,
   – en el primer elemento de una lista,
   – en el último elemento de una lista.
                                                           14




                                                                7
removeFirst()

public Object removeFirst()
   throws NoSuchElementException
{
    if ( first == null )     // si la lista está vacía
         throw new NoSuchElementException();
    else {
         SLink t = first;
         first = first.next;
          // si la lista tenía 1 elemento y ahora está vacía
         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




                                                                  8
removeFirst(), después


    Lista

primero   último




    Enlace 1       Enlace 2   ...             Enlace n     null




    Elem 1         Elem 2                 Elem n



                                                                  17




      removeFirst(), caso especial
    antes                           después

    Lista                             Lista

primero último                  primero   último




    Enlace 1       null              Enlace 1            null




    Elem 1                           Elem 1



                                                                  18




                                                                       9
addFirst(Object o)

public void addFirst(Object          o)
{
    if ( first == null )             // si la lista está vacía
    {
         first = last = new          SLink( o );
    }
    else
    {
         first = new SLink(        o, first );
    }

      length++;
}

                                                                     19




                       addFirst(), después


        Lista

    primero   último




                          Enlace 1        ...      Enlace n   null




                          Elem 1                   Elem n



                                                                     20




                                                                          10
addFirst(), después


    Lista

primero    último




   Enlace 0            Enlace 1   ...             Enlace n     null




   Elem 0              Elem 1                     Elem n



                                                                      21




           addFirst(), caso especial
    antes                                   después

     Lista                                  Lista
primero    último
                                        primero   último




    null                                   Enlace 1          null




                                            Elem 1



                                                                      22




                                                                           11
Lista enlazada - Ejercicio 1.1

•   Descargue el archivo LinkedListSim.zip del sitio web
    de clase. Hay un enlace a la página de material de clase.
    – En Netscape, vaya a     http://web.mit.edu/1.00/www/Lectures
    – En Clase 25, pulse LinkedListSim .zip con el botón derecho y
      seleccione "Guardar como". Guarde el archivo en el
      escritorio.
•   El archivo zip se descomprimirá en un directorio llamado
    LinkedListSim.
    – Haga doble clic en el archivo que ha guardado en el escritorio
    – Pulse el botón Extraer en el panel de comandos
    – Mediante el panel Carpetas/Unidades, desplácese hasta la
      ubicación en la que desea crear el directorio del proyecto.
      Pulse Extraer en el menú emergente homónimo y los archivos
      se descomprimirán en un subdirectorio llamado
      LinkedListSim.
                                                                   23




         Lista enlazada - Ejercicio 1.2

•   En Forte, cree un nuevo proyecto llamado
    LinkedListSim y adjunte el directorio que acaba de
    crear.
    – En Forte, seleccione Project->Project Manager
    – Haga clic en el botón New del menú emergente Project Manager
    – Nombre el proyecto como LinkedListSim
    – En la ficha File Systems, pulse con el botón derecho para acceder a
      la línea Files Systems situada al principio.
    – Seleccione el directorio de montaje y desplácese hasta el
      directorio raíz de LinkedListDirectory que acaba de crear.
      Seleccione el subdirectorio LinkedListSim y pulse Mount.
•   Agregue todos los archivos de Java a dicho directorio en el nuevo
    proyecto.
    – En la ficha Project, pulse con el botón derecho en
      Project LinkedListSim y seleccione Add Existing.
      Seleccione todos los archivos de Java del subdirectorio
      LinkedListSim y pulse OK.
•   Compílelo y ejecútelo. SLinkedListApp contiene main().
                                                                   24




                                                                            12
Lista enlazada - Ejercicio addFirst()

•   Experimente con la simulación. Observe la
    implementación en SLinkedList y List. El resto de los
    archivos gestionan la simulación. No es necesario que los
    analice, salvo que quiera hacerlo por curiosidad.
•   Los botones addLast y remove no funcionan, ya que se
    han eliminado las implementaciones del método
    correspondiente.
•   Observe el método addFirst() y escriba
    addLast(). Tenga cuidado con los casos especiales (¿cuáles
    son?).
•   Compile y pruebe el método con la simulación.



                                                                    25




           Lista enlazada - remove()

    • Ahora escribiremos el método remove(). Es más
    complicado. Analice los métodos contains() y
    removeFirst() para hacerse una idea de cómo empezar.
    Para poder eliminar un elemento con remove(), tendrá que
    encontrarlo primero.
•   ¿Cómo trataría el caso "normal" de eliminar un elemento
    de la mitad de la lista?. ¿Cómo repararía la “interrupción"
    de la lista?
    – Pista: tal vez quiera realizar el seguimiento de dos posiciones de
      la lista, current y previous.
•   ¿Qué casos especiales ha encontrado?


                                                                    26




                                                                           13
Lista enlazada - remove()

•   Aunque tiene libertad para utilizar su propia estrategia, a
    continuación incluimos un esquema del método que podría
    utilizarse:
    Inicializar variables
    mientras haya otro enlace
      si contiene el objeto que necesitamos eliminar
       si no estamos al principio de la lista
           eliminar elemento
          si acabamos de eliminar el último elemento
             reajustar el último
         de lo contrario estamos al principio de la lista
         eliminar elemento
          si sólo había un elemento en la lista
              reajustar el último
          ajustar tamaño
      de lo contrario ajustar referencias y avanzar al siguiente enlace

                                                                   27




      Listas y posición ordinal
•   Hay ciertas cosas evidentes que quisiéramos hacer con
    las listas pero que no podemos hacer utilizando sólo esta
    interfaz. Dos ejemplos:
    – ¿Cómo puede observar los elementos de la lista sin
      eliminarlos?
    – ¿Cómo podría insertar un elemento en la lista en cualquier
      posición que no sea el principio o el final?
•   Si crea su propia clase de lista, podrá realizar estas
    operaciones dentro de ella, pero el enfoque no sería
    general.
•   Un segundo enfoque está basado en el número o el índice
    de las posiciones de la lista.


                                                                   28




                                                                          14
Listas indexadas
• Entonces podríamos agregar dos métodos
    – public Object get( int n )
          throws NoSuchElementException;
    – public void insert( Object o, int n )
          throws NoSuchElementException;
• El siguiente bloque de código 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 métodos, ya que son fáciles 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 posición 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 telefónicos, no tenemos en cuenta el índice de
    una entrada, sino su posición relativa.


                                                                    30




                                                                         15
Iteradores
• Un iterador es una clase de ayuda que
  se utiliza con un List o con otra clase
  de colección.
• Cuenta con métodos para devolver los
  miembros de la colección de uno en uno.
• Los iteradores también pueden
  implementar métodos que permitan
  modificar la colección con relación a la
  posición 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
Métodos de iteradores
• El tipo de iterador que presentamos aquí devuelve un nuevo
  elemento y avanza hasta el siguiente con la misma
  operación next(). No hay forma de volver atrás con esta
  interfaz. ListIterator de Java permite ir hacia delante y hacia
  atrás.
• El elemento más reciente devuelto por next() es el
  elemento actual.
• remove() eliminará el elemento actual de la
  colección subyacente . set() lo modificará.
• add() insertará un nuevo elemento tras el elemento actual y
  delante del elemento que se devolvería 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 después del insertado.
• La primera llamada a next() debería devolver el primer
  elemento de la lista.
                                                                33




     El iterador y su lista subyacente

• Un iterador es un objeto basado en una
  colección subyacente, por lo que
  necesitamos dar con una forma de crear
  un iterador para una colección.
• Lo haremos agregando un método a nuestra
  interfaz List:
     public ListIterator listIterator();
• ¿Se pueden tener 2 iteradores en la misma lista
   lista?

                                                                34




                                                                     17
Cómo utilizar un iterador
 List myList = new SLinkedList();
   . . .
 ListIterator iter = myList.listIterator();
   . . .
 while ( iter.hasNext() )
 {
     Object o = iter.next();
     . . .
 }

                                                            35




              Un iterador en acción
Nuevo iterador                 Tras la 1ª llamada a
                 current          next()
    verde        sin definir      verde          current
     rojo                           rojo         es verde

    violeta                       violeta
   naranja                        naranja


 Tras agregar                  Tras 2ª llamada a
    negro        current es       next()         current
    verde        negro             verde         es rojo
    negro                          negro
     rojo                           rojo
    violeta                       violeta
   naranja                        naranja


                                                            36




                                                                 18
Un iterador en acción, 2

Tras llamar a                     Tras 3º llamada a
 remove()                            next()         current es
    verde                             verde          violeta
                 current sin
    negro                             negro
                 definir
                                     violeta
    violeta                          naranja
    naranja




                                                                 37




                Lista enlazada - Ejercicio 2

•    Descargue el archivo LinkedListIterSim.zip del sitio
     web de clase. Hay un enlace en la página del material de
     clase.
•    El archivo zip se descomprimirá en un directorio llamado
     LinkedListIterSim.
•    Cree un nuevo proyecto en Forte llamado LinkedListIterSim
     y adjunte el directorio que acaba de crear.
•    Agregue todos los archivos de Java al directorio en el proyecto.
•    Compílelo y ejecútelo. SLinkedListApp contiene main(). La
     vista List ahora aparece con un nuevo botón listIterator
     que abrirá una nueva ventana con el iterador actual. La vista
     principal muestra la posición actual del iterador.

                                                                 38




                                                                        19
Lista enlazada - Ejercicio 2, doubleList()

•   La vista List principal también presenta un botón rojo llamado
    "double". Púlselo. No hace nada. Todavía.
•   Al pulsar “double” se llama a un método de una nueva clase
    ListUtil:
    public static void doubleList( SLinkedList l )
• doubleList() está actualmente vacío. Escriba una
  implementación para doubleList() que obtenga un iterador
  para la lista, l, y que doble cada Integer de la misma.
  Probablemente querrá utilizar el método intValue() de
  Integer.
•   Compílelo y pruébelo.



                                                               39




           Cuidado con los iteradores
Vamos a hacer un experimento preparado. Cree y rellene una
  lista. Cree un iterador para dicha lista. Llame a
  removeFirst() en la lista para eliminar el primer elemento.
  Ahora llame a next() en el iterador. ¿Qué ocurre? ¿Qué
  debería ocurrir?
Aunque nuestra implementación es razonablemente sólida, los
  iteradores asumen que se les llama desde una lista fija, es
  decir, que NO se garantizan resultados correctos si se
  modifica una lista tras la construcción del iterador utilizando
  cualquier otra lista o métodos de instancias de iteradores.
  ¿Cómo se "arregla" esto? ¿Qué significa arreglar? ¿Sería
  mejor tener un iterador que siempre diese resultados
  “correctos” o uno que arrojase excepciones si se ha
  modificado la lista subyacente?
                                                               40




                                                                     20
Usos y variaciones de listas enlazadas

 • Como nuestra interfaz List procesa
   métodos append() y removeFirst(), es
   posible implementar una cola trivial encima
   del tipo de datos concreto SLinkedList.
 • ¿Cómo cambiaría la implementación si cada
   enlace tuviera una referencia anterior (previa)
   y una posterior (siguiente)? Estas listas
   reciben el nombre (sí, lo habrá adivinado) de
   listas enlazadas dobles. ¿Qué operaciones
   serán más fáciles?
                                              41




                                                     21

More Related Content

What's hot (20)

Estructuras dinamicas ppt
Estructuras dinamicas pptEstructuras dinamicas ppt
Estructuras dinamicas ppt
 
Estructura datos pilas y colas
Estructura datos pilas y colasEstructura datos pilas y colas
Estructura datos pilas y colas
 
Unidad 3 estructuras lineales estaticas y dinamicas
Unidad 3 estructuras lineales estaticas y dinamicasUnidad 3 estructuras lineales estaticas y dinamicas
Unidad 3 estructuras lineales estaticas y dinamicas
 
Listas Pilas Colas
Listas Pilas ColasListas Pilas Colas
Listas Pilas Colas
 
LISTAS
LISTASLISTAS
LISTAS
 
Listas y Pilas
Listas y PilasListas y Pilas
Listas y Pilas
 
COLAS
COLASCOLAS
COLAS
 
Listas en C#
Listas en C#Listas en C#
Listas en C#
 
Estructuras dinámicas
Estructuras dinámicasEstructuras dinámicas
Estructuras dinámicas
 
COLAS
COLASCOLAS
COLAS
 
Listas, pilas y colas
Listas, pilas y colasListas, pilas y colas
Listas, pilas y colas
 
Pilas, colas, y listas estructura de datos
Pilas, colas, y listas estructura de datosPilas, colas, y listas estructura de datos
Pilas, colas, y listas estructura de datos
 
Listas,pilas&colas yorka
Listas,pilas&colas yorkaListas,pilas&colas yorka
Listas,pilas&colas yorka
 
Ejercicios pilas y_colas
Ejercicios pilas y_colasEjercicios pilas y_colas
Ejercicios pilas y_colas
 
S6-EDD-3.2 Pilas y colas
S6-EDD-3.2 Pilas y colasS6-EDD-3.2 Pilas y colas
S6-EDD-3.2 Pilas y colas
 
Codigo para implementar pilas en java
Codigo para implementar pilas en javaCodigo para implementar pilas en java
Codigo para implementar pilas en java
 
Java Lambda
Java LambdaJava Lambda
Java Lambda
 
Notación infija postfija
Notación infija postfijaNotación infija postfija
Notación infija postfija
 
Lista,pilas y columnas
Lista,pilas y columnasLista,pilas y columnas
Lista,pilas y columnas
 
10. aplicaciones de las pilas
10. aplicaciones de las pilas10. aplicaciones de las pilas
10. aplicaciones de las pilas
 

Viewers also liked

Intro To C++ - Class #18: Vectors & Arrays
Intro To C++ - Class #18: Vectors & ArraysIntro To C++ - Class #18: Vectors & Arrays
Intro To C++ - Class #18: Vectors & ArraysBlue Elephant Consulting
 
Lenguaje Borland C - Estructura y Componentes
Lenguaje Borland C - Estructura y ComponentesLenguaje Borland C - Estructura y Componentes
Lenguaje Borland C - Estructura y ComponentesKarina Arguedas Ruelas
 
C++: inheritance, composition, polymorphism
C++: inheritance, composition, polymorphismC++: inheritance, composition, polymorphism
C++: inheritance, composition, polymorphismJussi Pohjolainen
 
Aplicación de vectores y matrices en c++
Aplicación de vectores y matrices en c++Aplicación de vectores y matrices en c++
Aplicación de vectores y matrices en c++Wladimir Pineida
 
Codigo Ascii
Codigo AsciiCodigo Ascii
Codigo Asciinelson
 
Basic c++ programs
Basic c++ programsBasic c++ programs
Basic c++ programsharman kaur
 
C++ Programming Language
C++ Programming Language C++ Programming Language
C++ Programming Language Mohamed Loey
 
2 virtual codigo_ascii
2 virtual codigo_ascii2 virtual codigo_ascii
2 virtual codigo_asciidiazsolano
 
A Guide to SlideShare Analytics - Excerpts from Hubspot's Step by Step Guide ...
A Guide to SlideShare Analytics - Excerpts from Hubspot's Step by Step Guide ...A Guide to SlideShare Analytics - Excerpts from Hubspot's Step by Step Guide ...
A Guide to SlideShare Analytics - Excerpts from Hubspot's Step by Step Guide ...SlideShare
 

Viewers also liked (17)

Basics of c++
Basics of c++Basics of c++
Basics of c++
 
Intro To C++ - Class #18: Vectors & Arrays
Intro To C++ - Class #18: Vectors & ArraysIntro To C++ - Class #18: Vectors & Arrays
Intro To C++ - Class #18: Vectors & Arrays
 
Vectors i operacions amb vectors
Vectors i operacions amb vectorsVectors i operacions amb vectors
Vectors i operacions amb vectors
 
Lenguaje Borland C - Estructura y Componentes
Lenguaje Borland C - Estructura y ComponentesLenguaje Borland C - Estructura y Componentes
Lenguaje Borland C - Estructura y Componentes
 
Cadena caracteres
Cadena caracteresCadena caracteres
Cadena caracteres
 
C++: inheritance, composition, polymorphism
C++: inheritance, composition, polymorphismC++: inheritance, composition, polymorphism
C++: inheritance, composition, polymorphism
 
Aplicación de vectores y matrices en c++
Aplicación de vectores y matrices en c++Aplicación de vectores y matrices en c++
Aplicación de vectores y matrices en c++
 
Codigo Ascii
Codigo AsciiCodigo Ascii
Codigo Ascii
 
Computer Programming- Lecture 6
Computer Programming- Lecture 6Computer Programming- Lecture 6
Computer Programming- Lecture 6
 
Listas enlazadas
Listas enlazadasListas enlazadas
Listas enlazadas
 
Intro to C++ - language
Intro to C++ - languageIntro to C++ - language
Intro to C++ - language
 
Basic c++ programs
Basic c++ programsBasic c++ programs
Basic c++ programs
 
C++ programming
C++ programmingC++ programming
C++ programming
 
C++ Programming Language
C++ Programming Language C++ Programming Language
C++ Programming Language
 
C++ ppt
C++ pptC++ ppt
C++ ppt
 
2 virtual codigo_ascii
2 virtual codigo_ascii2 virtual codigo_ascii
2 virtual codigo_ascii
 
A Guide to SlideShare Analytics - Excerpts from Hubspot's Step by Step Guide ...
A Guide to SlideShare Analytics - Excerpts from Hubspot's Step by Step Guide ...A Guide to SlideShare Analytics - Excerpts from Hubspot's Step by Step Guide ...
A Guide to SlideShare Analytics - Excerpts from Hubspot's Step by Step Guide ...
 

Similar to Lista enlazada

Similar to Lista enlazada (20)

Listas enlazadas
Listas enlazadasListas enlazadas
Listas enlazadas
 
Tda y heaps
Tda y heapsTda y heaps
Tda y heaps
 
Tad lista, pilas y colas
Tad lista, pilas y colasTad lista, pilas y colas
Tad lista, pilas y colas
 
Tad lista, pilas y colas
Tad lista, pilas y colasTad lista, pilas y colas
Tad lista, pilas y colas
 
Teoria de listas
Teoria de listasTeoria de listas
Teoria de listas
 
Implementación-de-pilas-por-medio-de-listas.pptx
Implementación-de-pilas-por-medio-de-listas.pptxImplementación-de-pilas-por-medio-de-listas.pptx
Implementación-de-pilas-por-medio-de-listas.pptx
 
Estructuras lineales
Estructuras linealesEstructuras lineales
Estructuras lineales
 
Estructura de datos
Estructura de datosEstructura de datos
Estructura de datos
 
Darwin rodriguez 12-0861_pilasy_colas
Darwin rodriguez 12-0861_pilasy_colasDarwin rodriguez 12-0861_pilasy_colas
Darwin rodriguez 12-0861_pilasy_colas
 
Lissette pimentel 11 1149 --- listas, pilas y colas
Lissette pimentel 11 1149 --- listas, pilas y colasLissette pimentel 11 1149 --- listas, pilas y colas
Lissette pimentel 11 1149 --- listas, pilas y colas
 
Listas c#
Listas c#Listas c#
Listas c#
 
Sesion_09.pptx
Sesion_09.pptxSesion_09.pptx
Sesion_09.pptx
 
Listas,pilas y colas Estructura de Datos
Listas,pilas y colas Estructura de DatosListas,pilas y colas Estructura de Datos
Listas,pilas y colas Estructura de Datos
 
05 listas1 t2018
05 listas1 t201805 listas1 t2018
05 listas1 t2018
 
Pilas Dylan Medina.pdf
Pilas Dylan Medina.pdfPilas Dylan Medina.pdf
Pilas Dylan Medina.pdf
 
universidad F. T.
universidad F. T.universidad F. T.
universidad F. T.
 
Operaciones con colas
Operaciones con colasOperaciones con colas
Operaciones con colas
 
Listas pilascolas edward.mejia-10-1314
Listas pilascolas edward.mejia-10-1314Listas pilascolas edward.mejia-10-1314
Listas pilascolas edward.mejia-10-1314
 
Listas, pilas y colas
Listas, pilas y colasListas, pilas y colas
Listas, pilas y colas
 
Listas de Java
Listas de JavaListas de Java
Listas de Java
 

Recently uploaded

El diseño de Algoritmos Paralelos.pdf - analisis de algortimos
El diseño de Algoritmos Paralelos.pdf - analisis de algortimosEl diseño de Algoritmos Paralelos.pdf - analisis de algortimos
El diseño de Algoritmos Paralelos.pdf - analisis de algortimosLCristinaForchue
 
La Electricidad y La Electrónica.pdf....
La Electricidad y La Electrónica.pdf....La Electricidad y La Electrónica.pdf....
La Electricidad y La Electrónica.pdf....Aaron Betancourt
 
TENDENCIAS DE IA Explorando el futuro de la tecnologia.pdf
TENDENCIAS DE IA Explorando el futuro de la tecnologia.pdfTENDENCIAS DE IA Explorando el futuro de la tecnologia.pdf
TENDENCIAS DE IA Explorando el futuro de la tecnologia.pdfJoseAlejandroPerezBa
 
De Código a Ejecución: El Papel Fundamental del MSIL en .NET
De Código a Ejecución: El Papel Fundamental del MSIL en .NETDe Código a Ejecución: El Papel Fundamental del MSIL en .NET
De Código a Ejecución: El Papel Fundamental del MSIL en .NETGermán Küber
 
VIDEOS DE APOYO.docx E
VIDEOS DE APOYO.docx                                  EVIDEOS DE APOYO.docx                                  E
VIDEOS DE APOYO.docx Emialexsolar
 
Carta de Premio y Excel angeline 11-2pdf
Carta de Premio y Excel angeline 11-2pdfCarta de Premio y Excel angeline 11-2pdf
Carta de Premio y Excel angeline 11-2pdfangelinebocanegra1
 
Matriz de integración de tecnologías- Paola Carvajal.docx
Matriz de integración de tecnologías- Paola Carvajal.docxMatriz de integración de tecnologías- Paola Carvajal.docx
Matriz de integración de tecnologías- Paola Carvajal.docxPaolaCarolinaCarvaja
 
Actividad 1-PRESENTACIÓN ANIMADA.pptxPreservación y conservación de los docum...
Actividad 1-PRESENTACIÓN ANIMADA.pptxPreservación y conservación de los docum...Actividad 1-PRESENTACIÓN ANIMADA.pptxPreservación y conservación de los docum...
Actividad 1-PRESENTACIÓN ANIMADA.pptxPreservación y conservación de los docum...OLGAMILENAMONTAEZNIO
 
Tecnológia 2024.docx.Tecnológia 2024.docx.
Tecnológia 2024.docx.Tecnológia 2024.docx.Tecnológia 2024.docx.Tecnológia 2024.docx.
Tecnológia 2024.docx.Tecnológia 2024.docx.marianarodriguezc797
 
Inteligencia artificial dentro de la contabilidad
Inteligencia artificial dentro de la contabilidadInteligencia artificial dentro de la contabilidad
Inteligencia artificial dentro de la contabilidaddanik1023m
 
Inmersión global en ciberseguridad e IA en la conferencia RSA.pdf
Inmersión global en ciberseguridad e IA en la conferencia RSA.pdfInmersión global en ciberseguridad e IA en la conferencia RSA.pdf
Inmersión global en ciberseguridad e IA en la conferencia RSA.pdfOBr.global
 
Los mejores simuladores de circuitos electrónicos.pdf
Los mejores simuladores de circuitos electrónicos.pdfLos mejores simuladores de circuitos electrónicos.pdf
Los mejores simuladores de circuitos electrónicos.pdfodalistar77
 
PRESENTACION DEL TEMA LOS MEJORES SIMULADORES DE CIRCUITOS ELCTRONICOS
PRESENTACION DEL TEMA LOS MEJORES SIMULADORES DE CIRCUITOS ELCTRONICOSPRESENTACION DEL TEMA LOS MEJORES SIMULADORES DE CIRCUITOS ELCTRONICOS
PRESENTACION DEL TEMA LOS MEJORES SIMULADORES DE CIRCUITOS ELCTRONICOSLincangoKevin
 
Presentación - Diseño de Algoritmos Paralelos - Grupo 2.pdf
Presentación - Diseño de Algoritmos Paralelos - Grupo 2.pdfPresentación - Diseño de Algoritmos Paralelos - Grupo 2.pdf
Presentación - Diseño de Algoritmos Paralelos - Grupo 2.pdfymiranda2
 
La tablet trabajo en grupo del grado 9-2
La tablet trabajo en grupo del grado 9-2La tablet trabajo en grupo del grado 9-2
La tablet trabajo en grupo del grado 9-2montoyagabriela340
 
Actividad 14_ Diseño de Algoritmos Paralelos.pdf
Actividad 14_ Diseño de Algoritmos Paralelos.pdfActividad 14_ Diseño de Algoritmos Paralelos.pdf
Actividad 14_ Diseño de Algoritmos Paralelos.pdfalejandrogomezescoto
 
Actividad 14: Diseño de Algoritmos Paralelos Actividad 14: Diseño de Algoritm...
Actividad 14: Diseño de Algoritmos Paralelos Actividad 14: Diseño de Algoritm...Actividad 14: Diseño de Algoritmos Paralelos Actividad 14: Diseño de Algoritm...
Actividad 14: Diseño de Algoritmos Paralelos Actividad 14: Diseño de Algoritm...RaymondCode
 
Análisis de artefactos tecnologicos .pdf
Análisis de artefactos tecnologicos .pdfAnálisis de artefactos tecnologicos .pdf
Análisis de artefactos tecnologicos .pdfcastrodanna185
 

Recently uploaded (20)

El diseño de Algoritmos Paralelos.pdf - analisis de algortimos
El diseño de Algoritmos Paralelos.pdf - analisis de algortimosEl diseño de Algoritmos Paralelos.pdf - analisis de algortimos
El diseño de Algoritmos Paralelos.pdf - analisis de algortimos
 
La Electricidad y La Electrónica.pdf....
La Electricidad y La Electrónica.pdf....La Electricidad y La Electrónica.pdf....
La Electricidad y La Electrónica.pdf....
 
TENDENCIAS DE IA Explorando el futuro de la tecnologia.pdf
TENDENCIAS DE IA Explorando el futuro de la tecnologia.pdfTENDENCIAS DE IA Explorando el futuro de la tecnologia.pdf
TENDENCIAS DE IA Explorando el futuro de la tecnologia.pdf
 
De Código a Ejecución: El Papel Fundamental del MSIL en .NET
De Código a Ejecución: El Papel Fundamental del MSIL en .NETDe Código a Ejecución: El Papel Fundamental del MSIL en .NET
De Código a Ejecución: El Papel Fundamental del MSIL en .NET
 
VIDEOS DE APOYO.docx E
VIDEOS DE APOYO.docx                                  EVIDEOS DE APOYO.docx                                  E
VIDEOS DE APOYO.docx E
 
Carta de Premio y Excel angeline 11-2pdf
Carta de Premio y Excel angeline 11-2pdfCarta de Premio y Excel angeline 11-2pdf
Carta de Premio y Excel angeline 11-2pdf
 
Matriz de integración de tecnologías- Paola Carvajal.docx
Matriz de integración de tecnologías- Paola Carvajal.docxMatriz de integración de tecnologías- Paola Carvajal.docx
Matriz de integración de tecnologías- Paola Carvajal.docx
 
Actividad 1-PRESENTACIÓN ANIMADA.pptxPreservación y conservación de los docum...
Actividad 1-PRESENTACIÓN ANIMADA.pptxPreservación y conservación de los docum...Actividad 1-PRESENTACIÓN ANIMADA.pptxPreservación y conservación de los docum...
Actividad 1-PRESENTACIÓN ANIMADA.pptxPreservación y conservación de los docum...
 
Tecnológia 2024.docx.Tecnológia 2024.docx.
Tecnológia 2024.docx.Tecnológia 2024.docx.Tecnológia 2024.docx.Tecnológia 2024.docx.
Tecnológia 2024.docx.Tecnológia 2024.docx.
 
Inteligencia artificial dentro de la contabilidad
Inteligencia artificial dentro de la contabilidadInteligencia artificial dentro de la contabilidad
Inteligencia artificial dentro de la contabilidad
 
Inmersión global en ciberseguridad e IA en la conferencia RSA.pdf
Inmersión global en ciberseguridad e IA en la conferencia RSA.pdfInmersión global en ciberseguridad e IA en la conferencia RSA.pdf
Inmersión global en ciberseguridad e IA en la conferencia RSA.pdf
 
Los mejores simuladores de circuitos electrónicos.pdf
Los mejores simuladores de circuitos electrónicos.pdfLos mejores simuladores de circuitos electrónicos.pdf
Los mejores simuladores de circuitos electrónicos.pdf
 
PRESENTACION DEL TEMA LOS MEJORES SIMULADORES DE CIRCUITOS ELCTRONICOS
PRESENTACION DEL TEMA LOS MEJORES SIMULADORES DE CIRCUITOS ELCTRONICOSPRESENTACION DEL TEMA LOS MEJORES SIMULADORES DE CIRCUITOS ELCTRONICOS
PRESENTACION DEL TEMA LOS MEJORES SIMULADORES DE CIRCUITOS ELCTRONICOS
 
Presentación - Diseño de Algoritmos Paralelos - Grupo 2.pdf
Presentación - Diseño de Algoritmos Paralelos - Grupo 2.pdfPresentación - Diseño de Algoritmos Paralelos - Grupo 2.pdf
Presentación - Diseño de Algoritmos Paralelos - Grupo 2.pdf
 
La tablet trabajo en grupo del grado 9-2
La tablet trabajo en grupo del grado 9-2La tablet trabajo en grupo del grado 9-2
La tablet trabajo en grupo del grado 9-2
 
Actividad 14_ Diseño de Algoritmos Paralelos.pdf
Actividad 14_ Diseño de Algoritmos Paralelos.pdfActividad 14_ Diseño de Algoritmos Paralelos.pdf
Actividad 14_ Diseño de Algoritmos Paralelos.pdf
 
BEDEC Proyecto y obra , novedades 2024 - Xavier Folch
BEDEC Proyecto y obra , novedades 2024 - Xavier FolchBEDEC Proyecto y obra , novedades 2024 - Xavier Folch
BEDEC Proyecto y obra , novedades 2024 - Xavier Folch
 
Actividad 14: Diseño de Algoritmos Paralelos Actividad 14: Diseño de Algoritm...
Actividad 14: Diseño de Algoritmos Paralelos Actividad 14: Diseño de Algoritm...Actividad 14: Diseño de Algoritmos Paralelos Actividad 14: Diseño de Algoritm...
Actividad 14: Diseño de Algoritmos Paralelos Actividad 14: Diseño de Algoritm...
 
BEDEC Sostenibilidad, novedades 2024 - Laura Silva
BEDEC Sostenibilidad, novedades 2024 - Laura SilvaBEDEC Sostenibilidad, novedades 2024 - Laura Silva
BEDEC Sostenibilidad, novedades 2024 - Laura Silva
 
Análisis de artefactos tecnologicos .pdf
Análisis de artefactos tecnologicos .pdfAnálisis de artefactos tecnologicos .pdf
Análisis de artefactos tecnologicos .pdf
 

Lista enlazada

  • 1. Clase 25 Listas enlazadas Colección de clases de Java • El paquete java.util contiene implementaciones de muchas de las estructuras de datos que vamos a tratar y que implementaremos de forma más sencilla en clase. • Puede utilizar las implementaciones estándar de Java en los boletines de problemas. Están más elaboradas y son más abstractas que las implemen- taciones de clase. • Al aprender a implementar varias estructuras de datos, profundizará en el modo en que utiliza todas las estructuras. 2 1
  • 2. Listas como un tipo de datos abstracto Una lista es un conjunto de elementos con un orden concreto: – Puede tener una longitud arbitraria. – Ofrece la posibilidad de insertar o eliminar un elemento en cualquier ubicación. – Ofrece la posibilidad de recorrer la lista de forma ordenada, de elemento en elemento. 3 Una interfaz List public interface List { public boolean isEmpty(); public void addFirst( Object o ); public void addLast( Object o ); public boolean contains(Object o); public boolean remove(Object o); public Object removeFirst() throws NoSuchElementException; public void clear(); public int size(); } 4 2
  • 3. Estrategias de implementación de listas • Existen muchas formas de implementar una lista. • En implementaciones basadas en arrays como el Vector de Java, insertar un elemento en cualquier lugar que no sea el final de la lista puede ser complejo, ya que todos los elementos que se encuentran entre el punto de inserción y el final de la lista deberán desplazarse una posición para dejar hueco para la nueva entrada. Ocurre algo similar con la eliminación. • Por ello, las listas suelen utilizar una implementación enlazada. 5 Listas enlazadas sencillas • Las listas enlazadas son como trenes de mercancías. • Cada elemento que que se va a poner en la lista está contenido en una instancia de un nuevo tipo de objeto, llamado enlace, que equivale a un vagón del tren. • En una lista enlazada sencilla, el enlace no sólo contiene el elemento de la lista, sino que también apunta al siguiente elemento de la lista, al igual que un vagón de mercancías está acoplado al siguiente. • El último enlace de la lista no apunta a nada. 6 3
  • 4. Diagrama de lista enlazada sencilla Lista primero último Enlace 1 Enlace 2 ... Enlace n null Elem 1 Elem 2 Elem n 7 Listas enlazadas sencillas, 2 • El objeto de la lista, en sí mismo, apunta al enlace que contiene el primer elemento mostrado y suele incluir una referencia adicional al último enlace de la lista para facilitar la incorporación de elementos. • Se dice que un enlace “contiene o “apunta a , y que la instancia de la lista “apunta o “contiene un puntero . En Java, todos ellos son sinónimos de contener una referencia. • Así, el enlace realmente no contiene el elemento, sino una referencia que señala al elemento de la lista. • El último enlace contiene una referencia null en el campo que apunta al siguiente elemento. 8 4
  • 5. Demostración de una lista enlazada sencilla List: Interfaz de lista SLinkedList: Implementación de lista SLinkedListApp: Aplicación main() SLinkedListView: GUI de lista 9 La clase interna de enlace public class SLinkedList implements List { private static class SLink { Object item; SLink next; SLink( Object o, SLink n ) { item = o; next = n; } SLink( Object o ) { this( o, null ); } } . . . 10 5
  • 6. Listas genéricas y tipadas • La interfaz List que hemos especificado es general, como la clase Vector de Java: almacena y recuperar objetos. • Si crea su propia clase de tipo lista y sa be, por ejemplo, que sólo trabajar á concadenas, puede sustituir lo s campo s Object por cam pos String. P or ejemp lo: 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 Miembros de datos de SLinkedList • Sólo es necesario first (primero). • last (último) y length (longitud) se pueden encontrar al recorrer la lista, pero si se conservan y se actualizan estos miembros, la llamada a size() y a append() es mucho más rápida. private int length = 0; private SLink first = null; private SLink last = null; 12 6
  • 7. == y el método Object equals • contains( Object o ) y remove( Object o ) deben buscar Object o en la lista. P ero, ¿q ué impli ca encontrarlo? • ¿Debe contener la lista una referencia al objeto idéntico (==)? ¿O basta con que contenga una referencia a un objeto equivalente pero posiblemente distinto? static private boolean objectEquals( Object a, Object b ) { if ( a == null ) return ( b == null ); else return a.equals( b ); } 13 Atención a los casos especiales • Lo difícil al implementar una lista enlazada no es implementar el caso habitual para cada método, por ejemplo, eliminar un objeto de la mitad de la lista. • Lo complicado es comprobar que los métodos también funcionen en casos excepcionales y ambiguos. • Para cada método, debe pensar en si la implementación funcionará en los siguientes casos – en una lista vacía, – en una lista con uno o dos elementos, – en el primer elemento de una lista, – en el último elemento de una lista. 14 7
  • 8. removeFirst() public Object removeFirst() throws NoSuchElementException { if ( first == null ) // si la lista está vacía throw new NoSuchElementException(); else { SLink t = first; first = first.next; // si la lista tenía 1 elemento y ahora está vacía 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 8
  • 9. removeFirst(), después Lista primero último Enlace 1 Enlace 2 ... Enlace n null Elem 1 Elem 2 Elem n 17 removeFirst(), caso especial antes después Lista Lista primero último primero último Enlace 1 null Enlace 1 null Elem 1 Elem 1 18 9
  • 10. addFirst(Object o) public void addFirst(Object o) { if ( first == null ) // si la lista está vacía { first = last = new SLink( o ); } else { first = new SLink( o, first ); } length++; } 19 addFirst(), después Lista primero último Enlace 1 ... Enlace n null Elem 1 Elem n 20 10
  • 11. addFirst(), después Lista primero último Enlace 0 Enlace 1 ... Enlace n null Elem 0 Elem 1 Elem n 21 addFirst(), caso especial antes después Lista Lista primero último primero último null Enlace 1 null Elem 1 22 11
  • 12. Lista enlazada - Ejercicio 1.1 • Descargue el archivo LinkedListSim.zip del sitio web de clase. Hay un enlace a la página de material de clase. – En Netscape, vaya a http://web.mit.edu/1.00/www/Lectures – En Clase 25, pulse LinkedListSim .zip con el botón derecho y seleccione "Guardar como". Guarde el archivo en el escritorio. • El archivo zip se descomprimirá en un directorio llamado LinkedListSim. – Haga doble clic en el archivo que ha guardado en el escritorio – Pulse el botón Extraer en el panel de comandos – Mediante el panel Carpetas/Unidades, desplácese hasta la ubicación en la que desea crear el directorio del proyecto. Pulse Extraer en el menú emergente homónimo y los archivos se descomprimirán en un subdirectorio llamado LinkedListSim. 23 Lista enlazada - Ejercicio 1.2 • En Forte, cree un nuevo proyecto llamado LinkedListSim y adjunte el directorio que acaba de crear. – En Forte, seleccione Project->Project Manager – Haga clic en el botón New del menú emergente Project Manager – Nombre el proyecto como LinkedListSim – En la ficha File Systems, pulse con el botón derecho para acceder a la línea Files Systems situada al principio. – Seleccione el directorio de montaje y desplácese hasta el directorio raíz de LinkedListDirectory que acaba de crear. Seleccione el subdirectorio LinkedListSim y pulse Mount. • Agregue todos los archivos de Java a dicho directorio en el nuevo proyecto. – En la ficha Project, pulse con el botón derecho en Project LinkedListSim y seleccione Add Existing. Seleccione todos los archivos de Java del subdirectorio LinkedListSim y pulse OK. • Compílelo y ejecútelo. SLinkedListApp contiene main(). 24 12
  • 13. Lista enlazada - Ejercicio addFirst() • Experimente con la simulación. Observe la implementación en SLinkedList y List. El resto de los archivos gestionan la simulación. No es necesario que los analice, salvo que quiera hacerlo por curiosidad. • Los botones addLast y remove no funcionan, ya que se han eliminado las implementaciones del método correspondiente. • Observe el método addFirst() y escriba addLast(). Tenga cuidado con los casos especiales (¿cuáles son?). • Compile y pruebe el método con la simulación. 25 Lista enlazada - remove() • Ahora escribiremos el método remove(). Es más complicado. Analice los métodos contains() y removeFirst() para hacerse una idea de cómo empezar. Para poder eliminar un elemento con remove(), tendrá que encontrarlo primero. • ¿Cómo trataría el caso "normal" de eliminar un elemento de la mitad de la lista?. ¿Cómo repararía la “interrupción" de la lista? – Pista: tal vez quiera realizar el seguimiento de dos posiciones de la lista, current y previous. • ¿Qué casos especiales ha encontrado? 26 13
  • 14. Lista enlazada - remove() • Aunque tiene libertad para utilizar su propia estrategia, a continuación incluimos un esquema del método que podría utilizarse: Inicializar variables mientras haya otro enlace si contiene el objeto que necesitamos eliminar si no estamos al principio de la lista eliminar elemento si acabamos de eliminar el último elemento reajustar el último de lo contrario estamos al principio de la lista eliminar elemento si sólo había un elemento en la lista reajustar el último ajustar tamaño de lo contrario ajustar referencias y avanzar al siguiente enlace 27 Listas y posición ordinal • Hay ciertas cosas evidentes que quisiéramos hacer con las listas pero que no podemos hacer utilizando sólo esta interfaz. Dos ejemplos: – ¿Cómo puede observar los elementos de la lista sin eliminarlos? – ¿Cómo podría insertar un elemento en la lista en cualquier posición que no sea el principio o el final? • Si crea su propia clase de lista, podrá realizar estas operaciones dentro de ella, pero el enfoque no sería general. • Un segundo enfoque está basado en el número o el índice de las posiciones de la lista. 28 14
  • 15. Listas indexadas • Entonces podríamos agregar dos métodos – public Object get( int n ) throws NoSuchElementException; – public void insert( Object o, int n ) throws NoSuchElementException; • El siguiente bloque de código 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 métodos, ya que son fáciles 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 posición 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 telefónicos, no tenemos en cuenta el índice de una entrada, sino su posición relativa. 30 15
  • 16. Iteradores • Un iterador es una clase de ayuda que se utiliza con un List o con otra clase de colección. • Cuenta con métodos para devolver los miembros de la colección de uno en uno. • Los iteradores también pueden implementar métodos que permitan modificar la colección con relación a la posición 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
  • 17. Métodos de iteradores • El tipo de iterador que presentamos aquí devuelve un nuevo elemento y avanza hasta el siguiente con la misma operación next(). No hay forma de volver atrás con esta interfaz. ListIterator de Java permite ir hacia delante y hacia atrás. • El elemento más reciente devuelto por next() es el elemento actual. • remove() eliminará el elemento actual de la colección subyacente . set() lo modificará. • add() insertará un nuevo elemento tras el elemento actual y delante del elemento que se devolvería 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 después del insertado. • La primera llamada a next() debería devolver el primer elemento de la lista. 33 El iterador y su lista subyacente • Un iterador es un objeto basado en una colección subyacente, por lo que necesitamos dar con una forma de crear un iterador para una colección. • Lo haremos agregando un método a nuestra interfaz List: public ListIterator listIterator(); • ¿Se pueden tener 2 iteradores en la misma lista lista? 34 17
  • 18. Cómo utilizar un iterador List myList = new SLinkedList(); . . . ListIterator iter = myList.listIterator(); . . . while ( iter.hasNext() ) { Object o = iter.next(); . . . } 35 Un iterador en acción Nuevo iterador Tras la 1ª llamada a current next() verde sin definir verde current rojo rojo es verde violeta violeta naranja naranja Tras agregar Tras 2ª llamada a negro current es next() current verde negro verde es rojo negro negro rojo rojo violeta violeta naranja naranja 36 18
  • 19. Un iterador en acción, 2 Tras llamar a Tras 3º llamada a remove() next() current es verde verde violeta current sin negro negro definir violeta violeta naranja naranja 37 Lista enlazada - Ejercicio 2 • Descargue el archivo LinkedListIterSim.zip del sitio web de clase. Hay un enlace en la página del material de clase. • El archivo zip se descomprimirá en un directorio llamado LinkedListIterSim. • Cree un nuevo proyecto en Forte llamado LinkedListIterSim y adjunte el directorio que acaba de crear. • Agregue todos los archivos de Java al directorio en el proyecto. • Compílelo y ejecútelo. SLinkedListApp contiene main(). La vista List ahora aparece con un nuevo botón listIterator que abrirá una nueva ventana con el iterador actual. La vista principal muestra la posición actual del iterador. 38 19
  • 20. Lista enlazada - Ejercicio 2, doubleList() • La vista List principal también presenta un botón rojo llamado "double". Púlselo. No hace nada. Todavía. • Al pulsar “double” se llama a un método de una nueva clase ListUtil: public static void doubleList( SLinkedList l ) • doubleList() está actualmente vacío. Escriba una implementación para doubleList() que obtenga un iterador para la lista, l, y que doble cada Integer de la misma. Probablemente querrá utilizar el método intValue() de Integer. • Compílelo y pruébelo. 39 Cuidado con los iteradores Vamos a hacer un experimento preparado. Cree y rellene una lista. Cree un iterador para dicha lista. Llame a removeFirst() en la lista para eliminar el primer elemento. Ahora llame a next() en el iterador. ¿Qué ocurre? ¿Qué debería ocurrir? Aunque nuestra implementación es razonablemente sólida, los iteradores asumen que se les llama desde una lista fija, es decir, que NO se garantizan resultados correctos si se modifica una lista tras la construcción del iterador utilizando cualquier otra lista o métodos de instancias de iteradores. ¿Cómo se "arregla" esto? ¿Qué significa arreglar? ¿Sería mejor tener un iterador que siempre diese resultados “correctos” o uno que arrojase excepciones si se ha modificado la lista subyacente? 40 20
  • 21. Usos y variaciones de listas enlazadas • Como nuestra interfaz List procesa métodos append() y removeFirst(), es posible implementar una cola trivial encima del tipo de datos concreto SLinkedList. • ¿Cómo cambiaría la implementación si cada enlace tuviera una referencia anterior (previa) y una posterior (siguiente)? Estas listas reciben el nombre (sí, lo habrá adivinado) de listas enlazadas dobles. ¿Qué operaciones serán más fáciles? 41 21