Метод listIterator() класса Java LinkedList
listIterator()Этот метод — важный метод в JavaLinkedListпредоставляемый классом, он возвращаетListIteratorобъект, используемый для обхода элементов в связанном списке. По сравнению с обычнымIteratorпо сравнению с,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.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());
}
}
}
Обход с указанной позиции
Пример
System.out.println("Обход с индекса 1:");
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
Изменение содержимого связного списка
Пример
iterator.next(); // Перейти к первому элементу
iterator.set("Apricot"); // Изменить первый элемент
iterator.add("Blueberry"); // Добавить новый элемент в текущую позицию
System.out.println("Изменённый связный список:");
for(String fruit : fruits) {
System.out.println(fruit);
}
Примечания
Одновременное изменение: Если связный список изменяется другими способами во время итерации (а не через собственные методы итератора), будет выброшено
ConcurrentModificationExceptionисключение.Начальная позиция: У только что созданного
ListIteratorкурсор изначально позиционируется перед первым элементом (для версии без аргументов) или перед указанной позицией индекса (для версии с параметрами).Проверка границ: Вызов
next()илиprevious()когда нет соответствующего элемента, исключениеNoSuchElementException。Ограничения операций модификации: Перед вызовом
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