链表实现多项式加法时系数错误及循环异常问题求助
问题原因分析与修复方案
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
相关产品推荐
相关产品推荐

