嘿,伙计们,我正在写一个算法来从NodeTree中删除具体的分支(比如DSF)。如果选择节点名称,算法将检查此节点是否为另一个节点的父节点;如果是,则获取此节点的子节点,并将其添加到堆栈中,依此类推。希望代码能够呈现这一点。
问题是循环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!==“。有什么想法吗?如果有什么不清楚的地方,对不起,我会尽量解释的。致以问候!
发布于 2018-01-09 00:22:19
看起来这些评论不足以让你挡道,然后我会添加一些解释,并添加我自己的解释:
_Bergi建议您使用while的另一种语法是有原因的:无论条件如何,do{ /*code*/ }while(condition)都会至少执行一次代码。您可能希望使用while(condition){ /*code*/ },因为使用此语法时,如果条件失败,则不会进入循环,并且条件是“如果var值存在”,如果条件失败,则不想进入循环。
_Amongst是我不会解释的另一件事(因为我想尽可能地保持清晰,这是一个更高级的特性),Jonas W.评论说你的情况是错误的。意思是“只要”。您的代码告诉您“只要stackTemp为false (或为空、未定义等),就留在循环中”。你可能想要相反的结果。
_Finally中,将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();
}https://stackoverflow.com/questions/48153280
复制相似问题