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

链表实现多项式加法时系数错误及循环异常问题求助

问题原因分析与修复方案

1. 测试代码重复调用add方法,导致原链表被多次修改

你的main方法中每次打印都调用PolynList.add(link1, link2),而add方法会直接修改link1的结构(追加节点、修改系数)。每调用一次,就会把link2的节点再叠加一次到link1上,这就是系数出现15、256这类异常值的原因——比如指数2的系数5被累加了3次,变成15。

修复:只调用一次add,保存结果后再遍历打印:

public static void main(String[] args) {
    // ... 原链表初始化代码
    
    Node result = PolynList.add(link1, link2);
    Node current = result;
    while (current != null) {
        System.out.println(current.coef);
        System.out.println(current.exp);
        current = current.next;
    }
}

2. itr1未在每次处理link2节点时重置到链表头部

原add方法中,itr1只初始化一次,处理完link2的第一个节点后,itr1停留在链表中间位置,后续处理link2的其他节点时,无法从链表开头找到正确的插入位置,导致节点插入逻辑混乱。

修复:在每次处理link2的节点前,将itr1重置为link1的哑节点:

while (itr2 != null) {
    int coef = itr2.coef;
    int exp = itr2.exp;
    Node itr1 = link1; // 每次循环重置到哑节点
    // ... 后续逻辑
}

3. 直接追加原link2节点导致重复处理

当link1遍历到末尾时,原代码执行itr1.next = itr2,这会把link2剩余的所有节点直接挂到link1上。而itr2还在继续遍历这些节点,导致外层循环重复处理已经添加过的节点,这就是System.out.println(newNode.coef)执行次数远超预期的原因。

修复:创建新节点追加到link1末尾,而非直接复用link2的节点:

if (itr1.next == null) {
    itr1.next = new Node(coef, exp);
}

4. 外层循环逻辑冗余

原外层循环从link2的哑节点开始,通过itr2.next != null判断,逻辑绕弯且容易出错。直接从link2的第一个实际节点开始遍历更清晰。

修正后的完整add方法

public class PolynList {
    public static Node add(Node link1, Node link2) {
        Node itr2 = link2.next; // 直接从link2的第一个实际节点开始遍历
        
        while (itr2 != null) {
            int coef = itr2.coef;
            int exp = itr2.exp;
            Node itr1 = link1; // 每次处理新节点前重置到哑节点
            
            while (itr1.next != null) {
                if (itr1.next.exp < exp) {
                    itr1 = itr1.next;
                } else {
                    if (itr1.next.exp == exp) {
                        // 指数相同,累加系数
                        itr1.next.coef += coef;
                    } else {
                        // 插入新节点到当前位置
                        Node newNode = new Node(coef, exp);
                        newNode.next = itr1.next;
                        itr1.next = newNode;
                    }
                    break;
                }
            }
            
            // 遍历到link1末尾,追加新节点
            if (itr1.next == null) {
                itr1.next = new Node(coef, exp);
            }
            
            itr2 = itr2.next; // 处理link2的下一个节点
        }
        
        return link1.next;
    }
}

内容的提问来源于stack exchange,提问作者DL32

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 16:28:18