2012-08-07 89 views
1

我想在Javascript中创建一个链接列表对象,我尝试将其反转。Javascript链接列表参考

我认为这是一个非常简单的问题,但我不知何故被卡住了。这是我的代码。

var Node = function (val) { 
this.value = val; 
this.next = null; 
}; 

var LinkList = function (node) { 
    var head = node; 

    function append(val) {...}; //works fine 
    function toString() {...}; //works fine 

    function reverse() { 
     if (!head.next) { 
      return; 
     } 
     var prev = head; 
     var cur = head.next; 
     while (cur) { 
      var temp = cur.next; 
      cur.next = prev; 
      prev = cur; 
      cur = temp; 
     } 
     head = prev; 
    } 

    return {head: head, append: append, toString: toString, reverse: reverse} 
} 

然后,我将10个项目追加到链接列表中并对其进行反向调用。它能够反转所有的节点,但是它无法将头重置到列表的末尾,但保持与原始头相同。

请解释为什么头不重置到列表的末尾。

回答

1

一旦你返回对象,你不能通过它们的单独引用来修改它的属性。只有函数关闭参考。对象不。

您需要保存对整个返回对象的引用并直接修改它的头部。

总的来说,有更好的方法来创建这样的复杂对象(参见原型)。

另外,Node是一个全球浏览器。使用其他名称,因为它已经代表DOM节点接口。

所以,牢记上述所有:

var LinkedList = function (node) { 
    this.head = node; 
}; 

LinkedList.prototype.append = function (val) { /* ... */ }; 

LinkedList.prototype.toString = function() { /* ... */ }; 

LinkedList.prototype.reverse = function() { 
    if (!this.head.next) { 
     return; 
    } 

    var prev = this.head; 
    var cur = prev.next; 
    while (cur) { 
     var temp = cur.next; 
     cur.next = prev; 
     prev = cur; 
     cur = temp; 
    } 
    this.head = prev; 
}; 

var linkedList = new LinkedList(someNode); 
+1

谢谢。它是否是'!this.head'而不是'!this.next'? – 2012-08-07 15:25:11

+0

对,'!this.head.next',对不起。 – katspaugh 2012-08-07 15:41:27

1

我想你不改变在返回对象的引用头部。您正在更改函数LinkedList顶部的变量,但是您将在底部返回一个新的引用。