Java LinkedList listIterator() 方法

Java LinkedList Java LinkedList


listIterator() 方法是 Java 中 LinkedList 类提供的一个重要方法,它返回一个 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()

性能考虑

  • LinkedListlistIterator() 方法的时间复杂度是 O(1),因为它只是创建一个新的迭代器对象。
  • 迭代器本身的各种操作(如 next()previous())的时间复杂度是 O(1),因为 LinkedList 是基于双向链表实现的。
  • 对于需要频繁在列表中间进行插入或删除操作的场景,使用 ListIterator 比通过索引直接操作更高效。

总结

LinkedListlistIterator() 方法提供了比普通迭代器更强大的功能,特别适合需要在遍历过程中修改链表内容或需要双向遍历的场景。理解并熟练使用这个方法可以让你更高效地操作 LinkedList

Java LinkedList Java LinkedList