Questions tagged «linked-list»

7
有什么实际的方法可以使链接的节点结构不可变?
我决定编写一个单链接列表,并制定了使内部链接节点结构不可变的计划。 不过我遇到了障碍。说我有以下链接的节点(来自先前的add操作): 1 -> 2 -> 3 -> 4 并说我想附加一个5。 为此,由于node 4是不可变的,因此我需要创建的新副本4,但将其next字段替换为包含的新节点5。现在的问题是3参考旧的4;没有附加的5。现在,我需要复制3,并替换其next字段以引用4副本,但是现在2引用的是旧版本3... 换句话说,要执行追加操作,似乎需要复制整个列表。 我的问题: 我的想法正确吗?有什么办法可以执行追加操作而不复制整个结构? 显然,“有效Java”包含以下建议: 类应该是不可变的,除非有充分的理由使它们可变。 这是变异性的好例子吗? 我认为这不是建议答案的重复,因为我不是在谈论清单本身。显然,它必须是可变的才能符合该接口(无需执行诸如在内部保留新列表并通过getter检索它的操作。不过,经过深思熟虑,即使这样也需要进行一些修改;将其保持在最低限度)。我说的是列表的内部是否必须不可变。

5
为什么缺点列表与函数式编程相关联?
我注意到,大多数功能语言都使用单链接列表(“ cons”列表)作为其最基本的列表类型。示例包括Common Lisp,Haskell和F#。这与主流语言不同,后者的本地列表类型是数组。 这是为什么? 对于Common Lisp(是动态键入的),我得到的想法是,缺点非常普遍,足以成为列表,树等的基础。这可能是一个微小的原因。 但是,对于静态类型的语言,我找不到很好的推理,甚至可以找到反参数: 功能性风格会促进不变性,因此链表的插入容易程度较弱, 功能风格鼓励不变性,因此也鼓励数据共享。数组比链表更容易“部分”共享, 您也可以对常规数组进行模式匹配,甚至更好(例如,您可以轻松地从右向左折叠), 最重要的是,您可以免费获得随机访问, 并且(一个实际的优势),如果该语言是静态类型的,则可以采用常规的内存布局并从高速缓存中提高速度。 那么为什么偏爱链表?


3
链表应始终具有尾指针吗?
我的理解... 优点: 在末尾插入的是O(1)而不是O(N)。 如果列表是双链表,则从末尾删除也是O(1)而不是O(N)。 坏处: 占用很少的额外内存:4-8个字节。 实施者必须跟踪尾巴。 从这些优点和缺点来看,我看不出为什么链表会避免使用尾部指针。有什么我想念的吗?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.