Java LinkedList listIterator() método

Java LinkedList Java LinkedList


listIterator()El método en Java esLinkedListun método importante proporcionado por la clase, que devuelve unListIteratorobjeto, utilizado para recorrer los elementos de la lista enlazada. En comparación con elIteratorIterator normal,ListIteratorproporciona funciones de operación más ricas.

Sintaxis del método

public ListIterator<E> listIterator()
public ListIterator<E> listIterator(int index)
  • Versión sin parámetros: devuelve un iterador de lista que comienza desde el inicio de la lista enlazada
  • Versión con parámetros: devuelve un iterador de lista que comienza desde la posición de índice especificada

Parámetros del método

Parámetro index

  • Tipo:int
  • Significado: el índice de posición donde comienza el iterador
  • Rango de valores:0 <= index <= size()
  • Si el índice pasado es igual al tamaño de la lista enlazada (size()), el iterador apuntará al final de la lista enlazada

Valor de retorno

Devuelve unListIteratorobjeto, que proporciona la capacidad de recorrer la lista enlazada bidireccionalmente.


Métodos principales de ListIterator

Métodos de recorrido

  • boolean hasNext(): comprueba si hay un siguiente elemento
  • E next(): devuelve el siguiente elemento y avanza el cursor
  • boolean hasPrevious(): comprueba si hay un elemento anterior
  • E previous(): devuelve el elemento anterior y retrocede el cursor

Métodos de modificación

  • void add(E e): inserta un elemento en la posición actual
  • void remove(): elimina lo devuelto por la última llamadanext()oprevious()el elemento devuelto
  • void set(E e): reemplaza lo devuelto por la última llamadanext()oprevious()el elemento devuelto

Ejemplo de uso

Ejemplo básico de recorrido

Ejemplo

import java.util.LinkedList;
import java.util.ListIterator;

public class Main {
    public static void main(String[] args) {
        LinkedList<String> fruits = new LinkedList<>();
        fruits.add("Apple");
        fruits.add("Banana");
        fruits.add("Cherry");
       
        // Obtener ListIterator
        ListIterator<String> iterator = fruits.listIterator();
       
        // Recorrido hacia adelante
        System.out.println("Recorrido hacia adelante:");
        while(iterator.hasNext()) {
            System.out.println(iterator.next());
        }
       
        // Recorrido hacia atrás
        System.out.println("\n"Recorrido hacia atrás:");
        while(iterator.hasPrevious()) {
            System.out.println(iterator.previous());
        }
    }
}

Recorrido desde una posición especificada

Ejemplo

ListIterator<String> iterator = fruits.listIterator(1);  // Comenzando desde el índice 1
System.out.println("Recorrido desde el índice 1:");
while(iterator.hasNext()) {
    System.out.println(iterator.next());
}

Modificar el contenido de la lista enlazada

Ejemplo

ListIterator<String> iterator = fruits.listIterator();
iterator.next();  // Moverse al primer elemento
iterator.set("Apricot");  // Modificar el primer elemento
iterator.add("Blueberry");  // Agregar un nuevo elemento en la posición actual

System.out.println("Lista enlazada modificada:");
for(String fruit : fruits) {
    System.out.println(fruit);
}

Notas

  1. Modificación concurrente: si la lista enlazada se modifica por otros medios durante la iteración (no a través de los métodos del propio iterador), se lanzará unaConcurrentModificationExceptionexcepción.

  2. Posición inicial: el recién creadoListIteratortiene la posición inicial del cursor antes del primer elemento (para la versión sin parámetros) o antes de la posición de índice especificada (para la versión con parámetros).

  3. Comprobación de límites: al llamar anext()oprevious()si no hay un elemento correspondiente, se lanzará unaNoSuchElementException。

  4. Restricciones de las operaciones de modificación: antes de llamar aadd()、remove()oset()primero se debe llamar anext()oprevious(), de lo contrario se lanzará unaIllegalStateException。


Diferencias con Iterator

Característica Iterator ListIterator
Dirección de recorrido Unidireccional (solo hacia adelante) Bidireccional (hacia adelante y hacia atrás)
Métodos de modificación Solo remove() add(), remove(), set()
Obtener índice No soportado Soporta nextIndex() y previousIndex()
Forma de creación iterator() listIterator()

Consideraciones de rendimiento

  • LinkedListdelistIterator()La complejidad temporal del método es O(1), porque solo crea un nuevo objeto iterador.
  • Las diversas operaciones del iterador en sí (comonext()、previous()) tienen una complejidad temporal de O(1), porqueLinkedListestá implementada sobre una lista doblemente enlazada.
  • Para escenarios donde se necesitan operaciones frecuentes de inserción o eliminación en el medio de la lista, usarListIteratores más eficiente que operar directamente a través de índices.

Resumen

LinkedListdelistIterator()El método proporciona funciones más potentes que los iteradores normales, especialmente adecuado para escenarios donde se necesita modificar el contenido de la lista enlazada durante el recorrido o se necesita un recorrido bidireccional. Comprender y usar este método con fluidez te permitirá operar de manera más eficienteLinkedList。

Java LinkedList Java LinkedList

Otras extensiones