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
。
点我分享笔记