Java LinkedList listIterator() 方法
listIterator() 方法是 Java 中 LinkedList 类提供的一个重要方法,它返回一个 ListIterator 对象,用于遍历链表中的元素。与普通的 Iterator 相比,ListIterator 提供了更丰富的操作功能。
方法语法
public ListIterator<E> listIterator()
public ListIterator<E> listIterator(int index)
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());
}
}
}
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());
}
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);
}
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
点我分享笔记