Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/418.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript中的双链表_Javascript_Data Structures_Linked List_Doubly Linked List - Fatal编程技术网

javascript中的双链表

javascript中的双链表,javascript,data-structures,linked-list,doubly-linked-list,Javascript,Data Structures,Linked List,Doubly Linked List,我正在用javascript构建链表。 我一部分都不懂 功能节点(元素){ this.element=元素; this.next=null; this.previous=null; } 函数{ this.head=新节点(“head”); this.find=find; this.findLast=findLast; 这个。移除=移除; this.insert=插入; this.display=显示; this.dispReverse=dispReverse; } 函数查找(项){ var c

我正在用javascript构建链表。 我一部分都不懂

功能节点(元素){
this.element=元素;
this.next=null;
this.previous=null;
}
函数{
this.head=新节点(“head”);
this.find=find;
this.findLast=findLast;
这个。移除=移除;
this.insert=插入;
this.display=显示;
this.dispReverse=dispReverse;
}
函数查找(项){
var currNode=this.head;
while(currNode.element!=项目){
currNode=currNode.next;
}
返回节点;
}
功能显示(列表){
var currNode=this.head.next;
while(currNode!=null){
console.log(currNode.element);
currNode=currNode.next;
}
}
函数插入(新元素,项){
var newNode=新节点(newElement);
var current=此项。查找(项目);
newNode.next=current.next;
newNode.previous=当前;
current.next=newNode;
//为什么我不需要这个零件?
//自从新节点被插入,我想,
//当前节点的下一个节点应将新节点指向上一个节点
//current.next.previous=newNode;
}
功能移除(项目){
var currNode=this.find(项目);
if(currNode.next!=null){
currNode.previous.next=currNode.next;
currNode.next.previous=currNode.previous;
currNode.next=null;
currNode.previous=null;
}
}
函数findLast(){
var currNode=this.head;
while(currNode.next!=null){
currNode=currNode.next;
}
返回节点;
}
函数dispReverse(){
var currNode=this.head;
currNode=this.findLast();
while(currNode.previous!=null){
console.log(currNode.element);
currNode=currNode.previous;
}
}
var cities=new-LList();
城市。插入(“康威”、“头部”);
城市。插入(“拉塞尔维尔”、“康威”);
城市。插入(“卡莱尔”、“拉塞尔维尔”);
城市。插入(“阿尔玛”、“卡莱尔”);
城市。显示();
城市。移除(“卡莱尔”);
城市。显示();
城市;
/*
输出应如下所示:
康威
拉塞尔维尔
卡莱尔
阿尔玛
康威
拉塞尔维尔
阿尔玛
阿尔玛
拉塞尔维尔
康威

*/
最后一行中的插入逻辑似乎错误:

current.next=newNode

current.next.previous=newNode

这实际上意味着

newNode.previous=newNode

因为您正在第3条语句中设置newNode旁边的current.next的值

应该是:


newNode.next.previous=newNode。

您需要在步骤3之前执行步骤4:

current.next.previous = newNode
current.next = newNode

实际上,
current.next
(C)的引用被设置为
newNode
(K),然后再查找“old”
current.next
previous
属性(
current.next.previous
,当指向B时)。为当前节点指定新值后,将立即更改对该节点的引用。这就是为什么
current.next.previous
实际上返回的是
newNode.previous
,而不是您期望的节点引用。

是否要告诉我们错误是什么?是否尝试通过某个console.log进行调试?你能告诉我们确切的错误吗?听起来像是一个参考问题me@FelixKling哦,我想我没有解释清楚。在insert函数中有这样的注释current.next.previous=newNode;我认为这是一个应该包含在insert函数中的正确代码,但当我将其放入函数中并运行它时,就会发生错误@正如我在上面提到的stephane ruhlmann,上面的代码工作得很好。我想知道的是我认为[current.next.previous=newNode;]应该包含在insert函数中。现在我用“/”作为评论。所以它没有出错。好吧,我明白了,对我来说仍然是一个对象引用问题,请参阅下面的答案!非常感谢你的帮助!。我很明白。但是我犯了这个错误未捕获的TypeError:无法将属性“previous”设置为null。我不知道怎么处理这件事。我仍然非常感谢你条理清晰的回答!谢谢谢谢它真的帮助我理解了这个问题@欢迎你。如果你发现答案特别有用,你可以把它标记为。看看这本书,它还提到接受答案,不鼓励用评论来留下“谢谢”的便条。哦,这是一个巨大的新手的错误!再次感谢!