15

我目前正在构建一个双向链表实现。
我正在尝试(或希望)做的是使用 setter / getter 来设置列表中的元素,就像在数组中一样:

var index = 5;
list[index] = node_x;

但是,我不能只使用这种语法,因为节点在技术上不是列表的属性。
将列表视为 2 个钩子。这 2 个钩子连接到链的 2 个末端,但您只能访问这 2 个连接的链环(以及它们的兄弟通过它们)。
其余的链链接不是列表的属性。这就是为什么如果可能的话,我需要覆盖[]对象上括号的实现。

我的(简化/缩短)代码是:

(function () {
    "use strict"
    window.List = function () {
        var Length //Etc
        return {
            //Getter / Setter example.
            get length() {return this.Length;},
            set length(n) {this.Length = n;},
            //Function example.
            insertBeginning: function (newNode) {/*  */},
            insertEnd: function (newNode) {/*  */},

            //Index getter / setter attempt.
            get i(index){ console.log(index); },
            set i(index, node){ console.log(index); }
        };
    };

}());

var list = new List();
list.length = 10 //This works just fine
console.log(list.length) // Returns 10, like expected.

现在,我试图用igetter/setter 做的是设置这样的元素:

var index = 5;
list.i(index) = node;

但是,当然,这是行不通的,因为:

  1. i不是函数;
  2. 显然,我不能将变量分配给函数。

我当然可以只使用一个函数来设置元素:

list.setAtIndex(index, node);

但我更愿意以某种方式覆盖对象的数组表示法。

所以,我的问题是,这可能吗?如果是这样,我能得到一些提示吗?我的搜索尝试只返回了这样的资源,我现在知道 getter/setter 是如何工作的。

4

3 回答 3

3

我想建议这是一个非常糟糕的主意。在链表的索引i处获取项目的成本是O(n)。通过索引访问链表是 Java 犯的一个错误,其他人不应该重蹈覆辙。这个错误不是针对 C++ 和 C# 的。

在大多数情况下,数组通常更适合随机插入和删除,因为线性搜索的O(n)成本在性能方面完全占主导地位,并且数组更适合预取。不,真的:http ://bulldozer00.com/2012/02/09/vectors-and-lists/

我建议在完全没有索引访问的情况下使用链表实现,因为您可以真正证明使用链表可以获得性能优势,也许是为了实现队列。我建议在所有其他情况下使用内置数组。除了在大多数情况下总体上更好之外,与任何第三方链表实现相比,您将获得对内置数组进行更多优化的好处。

于 2013-07-17T09:15:05.670 回答
3

除了这是一个坏主意之外,这根本不可能。

于 2014-12-15T13:07:34.230 回答
-1

我不知道你是否喜欢这个,但给它看看

codepen.io 前

我认为它还不能完全令人满意,因为它默认说在提供参数时,您要访问set.

于 2012-12-13T12:42:52.103 回答