java单向链表迭代器通过内部类实现iterator接口,维护current节点引用,支持hasnext()和next()操作,具备fail-fast机制和一次性遍历特性。

Java 中的迭代器在单向链表中实现遍历,核心是让链表类提供一个内部迭代器类(通常实现 Iterator<e></e> 接口),该类持有当前节点引用,并支持 hasNext() 和 next() 操作。单向链表天然适合正向遍历,不需要随机访问或反向能力。
单向链表节点与基础结构
先定义一个简单的单向链表节点和链表主体:
(不依赖 java.util.LinkedList,而是手写实现)
class Node<e> {
E data;
Node<e> next;
Node(E data) { this.data = data; }
}
class SinglyLinkedList<e> {
private Node<e> head;
private int size;
// 插入、获取大小等方法略...
public Iterator<e> iterator() {
return new LinkedListIterator();
}
private class LinkedListIterator implements Iterator<e> {
private Node<e> current = head;
@Override
public boolean hasNext() {
return current != null;
}
@Override
public E next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
E data = current.data;
current = current.next;
return data;
}
}
}</e></e></e></e></e></e></e>
迭代器的关键行为说明
这个内部迭代器类必须满足迭代器协议:
-
状态维护:用
current字段记住当前要返回的节点,初始为head -
判断终点:当
current == null时,表示已到链表尾,hasNext()返回false -
安全取值:每次调用
next()先检查是否还有元素,再返回当前节点数据,并将current移动到下一个节点 -
不支持 remove:标准实现中可抛出
UnsupportedOperationException,除非你额外实现删除逻辑(需处理前驱节点,单向链表中较麻烦)
使用方式和注意事项
你可以像使用集合一样用增强 for 循环或显式调用迭代器:
SinglyLinkedList<string> list = new SinglyLinkedList();
list.add("a"); list.add("b"); list.add("c");
// 方式1:增强 for 循环(自动调用 iterator())
for (String s : list) {
System.out.println(s); // 输出 a, b, c
}
// 方式2:手动控制
Iterator<string> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}</string></string>
注意:迭代器是“一次性”的——遍历完后 current 为 null,再次调用 next() 会抛异常;如需重复遍历,应重新调用 list.iterator() 获取新实例。
进阶:支持 fail-fast 或并发安全?
标准 JDK 的 LinkedList 迭代器是 fail-fast 的(通过修改计数器检测并发修改)。如果你希望自己的迭代器也具备此特性:
- 在链表类中加一个
modCount字段,每次结构修改(增删节点)就自增 - 迭代器初始化时记录当时的
expectedModCount - 每次调用
next()或hasNext()前校验两者是否一致,不一致则抛ConcurrentModificationException
若需线程安全,可考虑用 Collections.synchronizedList(new SinglyLinkedList()) 包装,或改用 CopyOnWriteArrayList(但注意它底层不是链表)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











