Java中自定义链表支持Iterator遍历的核心是实现Iterable<E>接口并返回私有内部迭代器类,该类需维护当前节点、实现hasNext()、next()(首次返回头节点)、remove()(可选),从而支持增强for循环和手动迭代。

Java 中用 Iterator 遍历自定义链表,核心是让链表类实现 Iterable 接口,并在其中返回一个实现了 Iterator 接口的内部迭代器类。这样就能用增强 for 循环或显式调用 iterator() 方法来遍历。
让自定义链表实现 Iterable 接口
假设你有一个简单的单向链表 MyLinkedList<E>,它包含节点类和基本操作。要支持 Iterator,必须实现 Iterable<E> 接口,重写 iterator() 方法:
- 该方法需返回一个实现了
Iterator<E>的对象(通常是私有内部类) - 泛型类型要与链表元素类型一致,确保类型安全
编写符合规范的 Iterator 内部类
这个内部类需要维护当前遍历位置(如当前节点引用),并实现三个关键方法:
-
hasNext():判断是否还有下一个元素,通常检查当前节点是否为
null -
next():返回下一个元素值,并将内部指针移到下一节点;若已到末尾,应抛出
NoSuchElementException -
remove()(可选):如果支持删除,需实现逻辑(例如删除上一次
next()返回的节点);不实现时可抛UnsupportedOperationException
注意:next() 应在首次调用时返回头节点数据,后续调用才推进指针——常见做法是在构造时把“游标”设为 head,并在 next() 中先保存当前值、再移动指针。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
实际使用示例
完成上述实现后,你的链表就可以像原生集合一样被遍历:
MyLinkedList<String> list = new MyLinkedList<>();
list.add("a");
list.add("b");
list.add("c");
// 方式1:增强 for 循环
for (String s : list) {
System.out.println(s);
}
// 方式2:手动使用 Iterator
Iterator<String> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
注意事项与常见坑
有几个细节容易出错,需特别留意:
- 迭代器应是fail-fast的(可选但推荐):如果链表在迭代过程中被外部修改(如调用
add()或remove()),下次调用next()或hasNext()应抛ConcurrentModificationException。可通过维护一个modCount计数器实现 -
remove()方法只能在调用过next()后执行一次,再次调用前必须再调一次next(),否则应抛异常 - 内部迭代器类建议声明为
private final,避免外部误用;节点引用建议用Node<E>类型,保持泛型一致性

















