单链表迭代器始终返回首个元素问题求助
问题分析与修复方案
核心问题点
- 迭代器无法遍历:你的
SimpleIterator每次调用next()时,仅返回cursor.next但从未移动cursor的位置,导致永远返回同一个元素;同时Node类的next()方法每次都会新建一个迭代器实例,每次都从头开始遍历,永远拿第一个单位。 - 群体攻击逻辑缺失:
Dragon的hit方法只调用了一次next(),就算迭代器正常,也只能攻击一个单位,没有遍历所有敌方部队。 - 触发机制未重置:
rounds变量在触发一次群体攻击后会持续累加,后续再也不会触发3轮一次的攻击。
具体修复步骤
1. 修复迭代器,实现正确遍历
修改Army内部的SimpleIterator,让它在每次调用next()时移动游标,并且正确返回作战单位:
private class SimpleIterator implements Iterator<Warrior> { Node cursor = head; boolean isFirstIteration = true; @Override public boolean hasNext() { // 处理部队为空的情况,以及第一次迭代的判断 if (isFirstIteration) { return head.next != head; } return cursor.next != head; } @Override public Warrior next() { if (!hasNext()) { throw new NoSuchElementException(); } // 第一次迭代从head的下一个节点开始 if (isFirstIteration) { cursor = head.next; isFirstIteration = false; } else { cursor = cursor.next; } // 返回实际的作战单位,而不是Node包装类 return cursor.warrior; } }
2. 重写Dragon的群体攻击逻辑
直接利用Army的Iterable特性遍历所有敌方单位,同时重置rounds以支持循环触发:
@Override public void hit(CanReceiveDamage opponent) { rounds++; // 直接判断对手是否为Army类型,无需通过ArmyWarrior if (opponent instanceof Army enemyArmy && rounds == 3) { // 遍历敌方所有单位造成群体伤害 for (Warrior warrior : enemyArmy) { warrior.receiveDamage(() -> FIRE_BREATH_MASS_DAMAGE); } // 重置轮次计数器,确保每3轮触发一次 rounds = 0; } }
3. 简化ArmyWarrior的冗余逻辑
你的Node类同时继承Warrior又持有Warrior实例,容易造成混淆;且ArmyWarrior的next()/hasNext()方法设计不合理,建议直接移除Node中这两个方法的实现,完全依靠Army的迭代器来遍历部队:
@Override public Warrior next() { // 移除原有实现,不再通过Node遍历,直接用Army的迭代器 throw new UnsupportedOperationException("请使用Army的迭代器遍历部队"); } @Override public boolean hasNext() { throw new UnsupportedOperationException("请使用Army的迭代器遍历部队"); }
为什么原来的代码会失败?
- 你的
SimpleIterator没有移动游标,每次调用next()都返回head.next,也就是永远第一个单位。 Node的next()每次新建迭代器,相当于每次都从头开始遍历,自然只能拿到第一个元素。hit方法只调用一次next(),就算迭代器正常,也只能攻击一个单位,且rounds不重置的话,后续再也不会触发群体攻击。
内容的提问来源于stack exchange,提问作者Fellou98
相关产品推荐
相关产品推荐

