大家好,我正在编写一个算法来从 NodeTree 中删除具体分支(例如 DSF)。如果您选择 Node 的名称,算法将检查该 Node 是否是其他 Node 的父 Node ;如果是,它会获取该 Node 的子 Node ,并添加到堆栈中,依此类推。希望代码能够呈现这一点。
问题是循环 do/while 被执行了两次,而我认为它应该执行一次。 while 内发生了 null 条件的情况,因为它被跳过了。
stack.push(keys.head);
// visited.push(flag.data);
while(stack.size>0){
stackTemp=stack.get()
stack.pop();
do{
values=stackTemp.next;
stack.push(values);
stackTemp=values.next;
stack.show();
}while (!stackTemp)
stackTemp=stack.get()
// console.log(stackTemp);
keyTemp=this.map.get(stackTemp.data);
if(keyTemp=undefined)
stack.pop();
}
我还检查了“stackTemp!==”。有任何想法吗?如果有不清楚的地方,抱歉,我会尽力解释。 问候!
最佳答案
看来评论还不足以妨碍你,我会添加解释,并添加我自己的内容:
_Bergi 建议您使用 while
的另一种语法,原因是:do{/*code*/}while(condition)
无论如何都会执行代码至少一次的条件。您可能想要使用 while(condition){/*code*/}
因为使用这种语法,如果条件失败,您将不会进入循环,并且您的条件是“如果 var 值存在",如果失败,你就不想进入。
_在我不会解释的另一件事中(因为我想尽可能保持清晰,这是一个更高级的功能),Jonas W. 评论说你的条件是错误的。 while 的意思是“只要”。您的代码告诉“只要 stackTemp
为 false(或为空、未定义等),就留在循环中”。您可能想要相反的结果。
_最后,将stackTemp.next
存储在values
中放置到数组中是没有用的。如果它是一个对象(或函数),则不会复制它的值,因为 JS 通过引用传递它们。您可以将 stackTemp.next
存储在数组中,它是相同的,因为 stackTemp
在之后被替换,它的引用被更改,并且 stackTemp.next
存储在数组中的内容不会受到影响。
这将是结果,如果仍然不起作用,则来自其他原因:
stack.push(keys.head);
// visited.push(flag.data);
while(stack.size>0){
stackTemp=stack.get()
stack.pop();
while (stackTemp){ //not supposed to enter here is stackTemp is empty
stack.push(stackTemp.next);
stackTemp=stackTemp.next; //stackTemp reference is replaced
stack.show();
}
stackTemp=stack.get()
// console.log(stackTemp);
keyTemp=this.map.get(stackTemp.data);
if(keyTemp=undefined)
stack.pop();
}
关于javascript - 跳过 do/while 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48153280/