基于Javascript的链表数据结构

基于Javascript的链表数据结构,javascript,data-structures,linked-list,Javascript,Data Structures,Linked List,我正在尝试使用Javascript找出链表数据结构。但有一部分我无法理解 function LinkedList() { var Node = function(element) { this.element = element; this.next = null; } var length = 0; var head = null; this.append = function(element) { var node = new Node(ele

我正在尝试使用Javascript找出链表数据结构。但有一部分我无法理解

function LinkedList() {
  var Node = function(element) {
    this.element = element;
    this.next = null;
  }

  var length = 0;
  var head = null;

  this.append = function(element) {
    var node = new Node(element),
      current;

    if (head === null) {
      head = node;
    } else {
      current = head;

      //loop the list until find last item
      while (current.next) {
        current = current.next
      }

      //get last item and assign next to node to make the link
      current.next = node
    }
    length++;
  }

  this.removeAt = function(position) {
    //check for out of bounds values
    if (position > -1 && position < length) {
      var current = head,
        previous,
        index = 0;

      if (position === 0) {
        head = current.next;
      } else {
        while (index++ < position) {
          debugger;
          previous = current;
          current = current.next;
        }

        previous.next = current.next;
      }

      length--;

      return current.element;

    } else {
      return null;
    }
  }

  this.toString = function() {
    var current = head,
      string = '';

    while (current) {
      string = current.element;
      current = current.next;
    }

    return string;
  }
}

var list = new LinkedList();
list.append(15);
list.append(10);
list.append(11);
list.removeAt(1);
函数链接列表(){
变量节点=函数(元素){
this.element=元素;
this.next=null;
}
变量长度=0;
var头=空;
this.append=函数(元素){
var节点=新节点(元素),
现在的
if(head==null){
头部=节点;
}否则{
电流=水头;
//循环列表,直到找到最后一项
while(当前.下一个){
当前=当前。下一步
}
//获取最后一项并分配到节点旁边以创建链接
current.next=节点
}
长度++;
}
this.removeAt=功能(位置){
//检查是否存在越界值
如果(位置>-1&&位置<长度){
无功电流=水头,
以前的
指数=0;
如果(位置===0){
头=当前。下一个;
}否则{
while(索引+++<位置){
调试器;
先前=当前;
当前=当前。下一步;
}
previous.next=current.next;
}
长度--;
返回当前元素;
}否则{
返回null;
}
}
this.toString=函数(){
无功电流=水头,
字符串=“”;
while(当前){
字符串=current.element;
当前=当前。下一步;
}
返回字符串;
}
}
var list=newlinkedlist();
列表。追加(15);
列表。附加(10);
列表。附加(11);
列表。删除(1);

我不明白在运行removeAt方法时,变量current如何丢失对节点的引用。

如果要创建链接列表,可以使用以下算法:-

var linkedList = function(){
  this.head=null;
  this.tail=null;
  this.size=0;
}
linkedList.prototype.add=function(obj){
 if(!this.head){
   this.head=obj;
   this.tail=obj;
   this.size++;
   return
 }
 this.tail.next = obj;
 this.tail=obj;
 this.size++;
}

请使用一些空格格式化您的代码-如果不进行格式化,很难解析代码,而且您收到帮助的可能性较小。当您说“…current失去了对节点的引用…”时,您是否在问如何/为什么删除节点?current是removeAt方法的一个局部变量,那么您到底看到了什么问题?我检查了您的代码,看起来一切正常,除了toString方法可能只返回尾部节点的内容。您是否可以添加代码来演示您看到的问题?能产生你意想不到的结果的东西?@nurdyguy是的,这是我不知道的部分get@marquezgon当您使用
previous
节点并使用
previous.next=current.next
将其next设置为
current.next
时,结果是
previous
现在直接链接到后面的节点
当前版本
。因此,您已经从列表中删除了
current
。然后在函数结束时,
当前
变量超出范围并被有效删除。