基于节点的数据结构的不可变性

时间:2012-04-05 19:10:41

标签: data-structures immutability

如果有人希望提供不可变版本,例如,是否存在任何通用方法? LinkidList,使用链接的节点序列实现?我理解在ArrayList的情况下你会复制底层数组,但在这种情况下,这对我来说并不那么明显......

1 个答案:

答案 0 :(得分:1)

不可变列表的基本表示方式与常规链表相同,只是通常修改列表的所有操作都会返回一个新列表。这个新列表不一定需要包含整个前一个列表的副本,但可以重用它的元素。

我建议通过以下方式实施以下操作:

  • 弹出前面的元素:只需返回指向下一个节点的指针。复杂性:O(1)。
  • 将元素推送到前面:创建一个指向旧列表的第一个节点的新节点并将其返回。 O(1)。
  • 将列表a与列表b连接:复制整个列表a并让最终节点中的指针指向列表b的开头。请注意,这比可变列表上的相同操作更快。 O(长度(a))。
  • 在x位置插入:将所有内容复制到x,将新元素添加到副本后面,并让该节点指向位置x + 1的旧列表.O(x)。
  • 移除位置x处的元素:实际上与插入相同。 O(x)的
  • 排序:您可以使用简单快速或合并排序。它不会比可变列表上的更快或更慢。唯一的区别是你不能排序到位,但必须排序到副本。 O(n * log n)。