1

我想在 Javascript 中创建一个 Linked List 对象,并尝试反转它。

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

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 个项目附加到链接列表并在其上调用 reverse。它能够反转所有节点,但无法将头重置到列表的末尾,但与原始头保持相同。

请解释为什么头部没有被重置到列表的末尾。

4

2 回答 2

1

一旦您返回对象,您就不能通过它们各自的引用来修改它的属性。只有函数关闭引用。对象没有。

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

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

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

因此,请记住以上所有内容:

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);
于 2012-08-07T06:40:16.690 回答
1

我认为您不会更改对返回对象中头部的引用。您正在更改函数 LinkedList 顶部的变量,但您正在底部返回一个新引用。

于 2012-08-07T06:47:20.003 回答