如何使用Java Iterator遍历自定义LinkedList打印数据,解决返回null问题
问题根因与修复方案
核心错误点
- 迭代器没有绑定实际存储数据的
MyLinkedList实例:MyLinkedListIterator内部初始化时新建了空链表,和main方法中添加了元素的链表完全无关,所以currentNode初始就是null,调用next自然返回空。 next方法逻辑错误:现有代码每次都返回链表头节点对象(不是节点存储的元素值),且直接把指针跳转到链表尾,完全不具备遍历能力。- 迭代器创建方式错误:main方法中直接实例化
MyLinkedListIterator,没有传入填充好数据的链表实例。 - 冗余实现:
MyLinkedList不需要实现Iterator接口,迭代逻辑是迭代器的职责,现有类中实现的hasNext/next都是无效代码。
修复步骤
1. 修改MyLinkedListIterator类
给迭代器增加带参构造方法,接收要遍历的链表实例,同时修正next方法的遍历逻辑:
class MyLinkedListIterator<E> implements Iterator<E> { MyLinkedList<E> list; Node<E> currentNode; // 新增带参构造,绑定要遍历的链表 public MyLinkedListIterator(MyLinkedList<E> list) { this.list = list; this.currentNode = list.head; } public boolean hasNext() { return currentNode != null; } // 修正next逻辑,返回当前节点元素,指针后移 public E next() { E res = currentNode.element; currentNode = currentNode.next; return res; } }
2. 修改MyLinkedList的iterator方法
传入当前链表实例给迭代器,同时删除MyLinkedList类的Iterator接口实现(以及对应的无效hasNext/next方法):
// 修改类定义,不再实现Iterator接口 class MyLinkedList<E> implements MyList<E> { // 原有其他属性、方法保持不变 public Iterator<E> iterator() { return new MyLinkedListIterator(this); } }
3. 修改main方法中迭代器的创建方式
调用链表自身的iterator()方法获取绑定了当前数据的迭代器:
public static void main(String[] args) throws Exception { MyLinkedList<String> list = new MyLinkedList<>(); list.add("drop"); list.add("goofy"); list.add("Donald"); list.add("Duck"); list.add("Mouse"); list.add("Kangaroo"); list.add("Koala"); // 调用链表的iterator方法获取迭代器 Iterator<String> iter = list.iterator(); while (iter.hasNext()) { System.out.print(iter.next() + " "); } }
运行效果
修复后输出结果为:drop goofy Donald Duck Mouse Kangaroo Koala
内容的提问来源于stack exchange,提问作者Andrew Amirzadeh
相关产品推荐
相关产品推荐

