Java自定义链表实现Iterable接口时如何让迭代器返回Node类型
自定义链表迭代器返回Node节点的实现方案
你需要调整Iterable接口的泛型参数、修正迭代器方法的泛型声明即可实现需求,修改要点如下:
- 实现
Iterable接口时,直接将泛型参数指定为内部类Node,代表迭代器返回的元素类型为Node - 删除
iterator()方法上多余的方法级泛型声明<T>,避免和类级泛型混淆 - 修正
hasNext()方法的判断逻辑,避免空指针异常,同时避免漏掉最后一个节点
修改后的完整代码
import java.util.Iterator; class OwnList<Type> implements Iterable<OwnList<Type>.Node>{ class Node{ Type data; Node next; public Node(Type data, Node next){ this.data = data; this.next = next; } } Node head; @Override public Iterator<Node> iterator(){ return new Iterator<Node>(){ // 初始指向头节点 private Node current = head; @Override public boolean hasNext(){ // 只要当前节点不为空就存在下一个可返回的元素 return current != null; } @Override public Node next(){ Node returnNode = current; current = current.next; return returnNode; } @Override public void remove(){ // 不支持移除操作可以直接抛出异常 throw new UnsupportedOperationException("remove operation not supported"); } }; } }
使用示例
你可以直接在增强for循环中拿到Node对象进行操作:
public static void main(String[] args) { OwnList<String> myList = new OwnList<>(); // 此处省略给myList添加节点的逻辑 // foreach遍历直接获取Node节点 for (OwnList<String>.Node node : myList) { System.out.println(node.data); // 可直接操作节点的next等属性,满足灵活需求 } }
兼容常规使用的优化建议
如果你后续需要兼顾常规场景(迭代返回节点存储的数据),可以保留默认迭代器返回Type类型,单独新增一个获取Node迭代器的方法:
// 常规迭代器,返回节点存储的数据 @Override public Iterator<Type> iterator() { // 实现逻辑返回data即可 } // 单独提供返回Node的迭代器方法 public Iterator<Node> nodeIterator() { // 上文写的返回Node的迭代器实现 }
内容的提问来源于stack exchange,提问作者user17532119
相关产品推荐
相关产品推荐

