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}
}

次に、Link List に 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

返されるオブジェクトの head への参照を変更しないと思います。関数 LinkedList の上部で変数を変更していますが、下部で新しい参照を返しています。

于 2012-08-07T06:47:20.003 に答える