嘿伙计们,我正在编写一种算法来从 NodeTree 中删除具体的分支(如 DSF)。如果选择节点的名称,则算法正在检查此节点是否是另一个节点的父节点;如果是,它将获取此节点的子节点,并添加到堆栈等。希望代码能呈现这一点。
问题是循环 do/while 正在执行两次,而我认为它应该执行一次。内部发生空条件时发生了一些事情,因为它被跳过了。
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 值",则在失败时您不想输入。
_Amongst另一件事我不会解释(因为我想尽可能保持清晰,这是一个更高级的功能),乔纳斯W.评论说你的条件是错误的。虽然的意思是"只要"。你的代码告诉"只要stackTemp
是假的(或空的,未定义的等)就留在循环中"。你可能想要相反的情况。
_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();
}