NodeTree分支移除算法中do/while循环执行异常求助
问题分析与解决思路
先帮你拆解代码里的几个关键问题,这应该就是导致循环多执行一次的核心原因:
1. 致命的赋值/比较混淆错误
你这段判断完全写错了:
if(keyTemp=undefined) stack.pop();
这是赋值操作(把undefined硬塞给keyTemp),不是相等判断!这个表达式永远返回undefined,在if里会被判定为false,所以后面的stack.pop()根本不会执行——栈里的无效元素没被清理,自然会导致循环多跑一轮。必须改成严格相等判断:
if(keyTemp === undefined) stack.pop();
2. do/while循环的逻辑颠倒
你的循环条件写反了:while (!stackTemp)意味着当stackTemp为空时继续循环,但do块是先执行再判断,这就会导致:
- 当
stackTemp的next为空时,do块会再执行一次,把空值push进栈 - 空值被推入栈后,下一轮外层循环就会多处理一次无效元素,表现为循环多跑一次
正确的逻辑应该是当stackTemp存在时才继续遍历,而且用普通while代替do/while会更直观,避免“先执行一次”带来的空值风险:
// 替换原来的do/while块 let temp = stackTemp.next; while (temp) { stack.push(temp); temp = temp.next; stack.show(); }
3. 栈操作的顺序混乱
你先stack.get()再stack.pop(),处理完又stack.get()的操作逻辑很容易出错——比如弹出栈顶后,你处理它的子节点并push回栈,这时候再get()拿到的是刚push的新元素,完全打乱了遍历顺序。正确的做法应该是直接弹出栈顶节点再处理:
// 替换原来的栈顶获取逻辑 const currentNode = stack.pop(); // 用currentNode去遍历子节点、做映射检查
修正后的代码示例
结合以上问题调整后的代码大概是这样,你可以根据自己的分支移除逻辑再细化:
stack.push(keys.head); while(stack.size > 0){ const currentNode = stack.pop(); // 遍历当前节点的所有子节点链 let temp = currentNode.next; while (temp) { stack.push(temp); temp = temp.next; stack.show(); } // 检查节点映射并做清理 const keyTemp = this.map.get(currentNode.data); if(keyTemp === undefined) { // 这里执行你的节点移除逻辑,而不是栈pop(栈pop已经在开头做了) } }
另外你提到的“检查该节点是否为其他节点的父节点”逻辑,在当前代码里还没体现,你可以在处理currentNode的时候,新增判断它是否存在子节点(或被其他节点引用为父节点)的逻辑,再调整子节点的入栈规则。
先把上面三个核心问题修复,应该就能解决循环执行两次的问题了。
内容的提问来源于stack exchange,提问作者aggre1234
相关产品推荐
相关产品推荐

