javascript中的双链表
我正在用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
功能节点(元素){
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。我不知道怎么处理这件事。我仍然非常感谢你条理清晰的回答!谢谢谢谢它真的帮助我理解了这个问题@欢迎你。如果你发现答案特别有用,你可以把它标记为。看看这本书,它还提到接受答案,不鼓励用评论来留下“谢谢”的便条。哦,这是一个巨大的新手的错误!再次感谢!