Метод listIterator() класса Java LinkedList

Java LinkedList Java LinkedList


listIterator()Этот метод — важный метод в JavaLinkedListпредоставляемый классом, он возвращаетListIteratorобъект, используемый для обхода элементов в связанном списке. По сравнению с обычнымIteratorпо сравнению с,ListIteratorон предоставляет более богатые функции операций.

Синтаксис метода

public ListIterator<E> listIterator()
public ListIterator<E> listIterator(int index)
  • Версия без аргументов: возвращает итератор списка, начиная с начала связанного списка
  • Параметризованная версия: возвращает итератор списка, начиная с указанной позиции индекса

Параметры метода

параметр index

  • Тип:int
  • Значение: индекс позиции, с которой начинается итератор
  • Диапазон значений:0 <= index <= size()
  • Если переданный индекс равен размеру связного списка (size()), итератор будет указывать на конец связного списка

Возвращаемое значение

ВозвращаетListIteratorобъект, который обеспечивает возможность обхода связного списка в обоих направлениях.


Основные методы ListIterator

Методы обхода

  • boolean hasNext(): Проверяет, есть ли следующий элемент
  • E next(): Возвращает следующий элемент и перемещает курсор вперёд
  • boolean hasPrevious(): Проверяет, есть ли предыдущий элемент
  • E previous(): Возвращает предыдущий элемент и перемещает курсор назад

Методы модификации

  • void add(E e): Вставляет элемент в текущую позицию
  • void remove(): Удаляет последний элемент, возвращённый при вызовеnext()илиprevious()элемент, возвращённый
  • void set(E e): Заменяет последний элемент, возвращённый при вызовеnext()илиprevious()элемент, возвращённый

Примеры использования

Пример базового обхода

Пример

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");
       
        // Получить ListIterator
        ListIterator<String> iterator = fruits.listIterator();
       
        // Прямой обход
        System.out.println("Прямой обход:");
        while(iterator.hasNext()) {
            System.out.println(iterator.next());
        }
       
        // Обратный обход
        System.out.println("\n"Обратный обход:");
        while(iterator.hasPrevious()) {
            System.out.println(iterator.previous());
        }
    }
}

Обход с указанной позиции

Пример

ListIterator<String> iterator = fruits.listIterator(1);  // Начать с индекса 1
System.out.println("Обход с индекса 1:");
while(iterator.hasNext()) {
    System.out.println(iterator.next());
}

Изменение содержимого связного списка

Пример

ListIterator<String> iterator = fruits.listIterator();
iterator.next();  // Перейти к первому элементу
iterator.set("Apricot");  // Изменить первый элемент
iterator.add("Blueberry");  // Добавить новый элемент в текущую позицию

System.out.println("Изменённый связный список:");
for(String fruit : fruits) {
    System.out.println(fruit);
}

Примечания

  1. Одновременное изменение: Если связный список изменяется другими способами во время итерации (а не через собственные методы итератора), будет выброшеноConcurrentModificationExceptionисключение.

  2. Начальная позиция: У только что созданногоListIteratorкурсор изначально позиционируется перед первым элементом (для версии без аргументов) или перед указанной позицией индекса (для версии с параметрами).

  3. Проверка границ: Вызовnext()илиprevious()когда нет соответствующего элемента, исключениеNoSuchElementException。

  4. Ограничения операций модификации: Перед вызовомadd()、remove()илиset()сначала необходимо вызватьnext()илиprevious(), иначе исключениеIllegalStateException。


Отличия от Iterator

Характеристика Iterator ListIterator
Направление обхода Одностороннее (только вперёд) Двустороннее (вперёд и назад)
Методы модификации Только remove() add(), remove(), set()
Получить индекс Не поддерживается Поддерживает nextIndex() и previousIndex()
Метод создания iterator() listIterator()

Соображения производительности

  • LinkedListизlistIterator()Метод имеет временную сложность O(1), потому что он просто создаёт новый объект итератора.
  • Различные операции самого итератора (такие какnext()、previous()) имеют временную сложность O(1), потому чтоLinkedListон реализован на основе двусвязного списка.
  • Для сценариев, требующих частой вставки или удаления в середине списка, использованиеListIteratorболее эффективен, чем работа напрямую через индексы.

Итог

LinkedListизlistIterator()Метод предоставляет более мощный функционал, чем обычный итератор, особенно подходит для сценариев, когда нужно изменять содержимое связанного списка во время обхода или требуется двунаправленный обход. Понимание и умелое использование этого метода позволяет более эффективно работать сLinkedList。

Java LinkedList Java LinkedList

Другие расширения