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

Data structures 基于节点的数据结构的不变性,data-structures,immutability,Data Structures,Immutability,如果要提供一个不可变的版本(如LinkId List),使用链接的节点序列实现,是否有任何通用方法?我知道在ArrayList的情况下,您会复制底层数组,但在这种情况下,这对我来说并不明显…不可变列表基本上以与常规链表相同的方式表示,只是所有通常会修改列表的操作都会返回一个新列表。这个新列表不一定需要包含整个先前列表的副本,但可以重用其中的元素 我建议通过以下方式实施以下操作: 在前面弹出元素:只需返回指向下一个节点的指针。复杂性:O(1) 将元素推到前面:创建一个指向旧列表的第一个节点的新节

如果要提供一个不可变的版本(如LinkId List),使用链接的节点序列实现,是否有任何通用方法?我知道在ArrayList的情况下,您会复制底层数组,但在这种情况下,这对我来说并不明显…

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

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

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