You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

单链表迭代器始终返回首个元素问题求助

问题分析与修复方案

核心问题点

  1. 迭代器无法遍历:你的SimpleIterator每次调用next()时,仅返回cursor.next但从未移动cursor的位置,导致永远返回同一个元素;同时Node类的next()方法每次都会新建一个迭代器实例,每次都从头开始遍历,永远拿第一个单位。
  2. 群体攻击逻辑缺失:Dragon的hit方法只调用了一次next(),就算迭代器正常,也只能攻击一个单位,没有遍历所有敌方部队。
  3. 触发机制未重置: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 04:02:19