如何在Scala中创建不可变的双链接列表?
有人能帮我在Scala中通过显示一个方法实现来创建不可变的双链表吗?另外,您可以通过实现prepend(元素:Int):DoublyLinkedList[Int]为我提供一个例子吗?按名称调用和lazy-val(按需调用)使不可变的双链接列表成为可能。按名称调用和lazy-val(按需调用)使具有不可变的双链接列表成为可能。以文本版本的链接补充已链接的视频,并包含重要的引号: 这在中进行了描述 在Scala中,双链接列表没有提供太多好处,恰恰相反 因此,从实用的角度来看,这种数据结构是非常无用的,这就是为什么。。。Scala标准集合库中没有双链接列表 综上所述,双链表是关于不可变数据结构的心智模型的一个很好的练习 想一想:在Java中,此操作将通过3个步骤完成:如何在Scala中创建不可变的双链接列表?,scala,doubly-linked-list,Scala,Doubly Linked List,有人能帮我在Scala中通过显示一个方法实现来创建不可变的双链表吗?另外,您可以通过实现prepend(元素:Int):DoublyLinkedList[Int]为我提供一个例子吗?按名称调用和lazy-val(按需调用)使不可变的双链接列表成为可能。按名称调用和lazy-val(按需调用)使具有不可变的双链接列表成为可能。以文本版本的链接补充已链接的视频,并包含重要的引号: 这在中进行了描述 在Scala中,双链接列表没有提供太多好处,恰恰相反 因此,从实用的角度来看,这种数据结构是非常无用的
- 新节点
- 新节点的prev为1
- 1的下一个节点是新节点
updatePrev
:我们正在创建一个新节点,它的下一个引用立即指向递归调用;递归调用在当前的下一个节点上,它将更新它自己以前对结果的引用,我们仍在定义过程中!只有在存在惰性值和按名称参数的情况下,才可能进行此正向引用
以文本版本的链接补充已链接的视频,并包括重要的引用:
这在中进行了描述
在Scala中,双链接列表没有提供太多好处,恰恰相反
因此,从实用的角度来看,这种数据结构是非常无用的,这就是为什么。。。Scala标准集合库中没有双链接列表
综上所述,双链表是关于不可变数据结构的心智模型的一个很好的练习
想一想:在Java中,此操作将通过3个步骤完成:
- 新节点
- 新节点的prev为1
- 1的下一个节点是新节点
updatePrev
:我们正在创建一个新节点,它的下一个引用立即指向递归调用;递归调用在当前的下一个节点上,它将更新它自己以前对结果的引用,我们仍在定义过程中!只有在存在惰性值和按名称参数的情况下,才可能进行此正向引用
如果创建不可变的双链接列表,那么它的效率将非常低,因为任何返回新列表的操作都需要复制整个列表,这意味着即使是空列表也需要复制,而不是共享。-你为什么需要这个?家庭作业?如果是这样的话,您至少能够实现一个单一的链表吗?当您创建一个新元素时,您可以将引用传递给上一个元素并使其不可变。但是只有在创建这个元素之后,您才有一个可以传递给前一个元素的引用,以便它将其存储为“next”。您也不能有一个
Nil
元素,因为它不能从两个不同的列表中指向前面的两个元素。事实上,在创建新的列表时,不能重用列表中的任何元素。因此,您必须在每次操作中重新分配整个列表,使其基本上成为一个没有O(1)索引访问的无效不可变数组。这是你需要的两个技巧。这能回答你的问题吗?如果创建不可变的双链接列表,那么它的效率将非常低,因为任何返回新列表的操作都需要复制整个列表,这意味着即使是空列表也需要复制,而不是共享。-你为什么需要这个?家庭作业?如果是这样的话,您至少能够实现一个单一的链表吗?当您创建一个新元素时,您可以将引用传递给上一个元素并使其不可变。但是只有在创建这个元素之后,您才有一个可以传递给前一个元素的引用,以便它将其存储为“next”。您也不能有一个Nil
元素,因为它不能从两个不同的列表中指向前面的两个元素。事实上,在创建新的列表时,不能重用列表中的任何元素。因此,您必须在每次操作中重新分配整个列表,使其基本上成为一个没有O(1)索引访问的无效不可变数组。这是你需要的两个技巧。这能回答你的问题吗?
class DLCons[+T](override val value: T, p: => DLList[T], n: => DLList[T]) extends DLList[T] {
// ... other methods
override def updatePrev[S >: T](newPrev: => DLList[S]) = {
lazy val result: DLCons[S] = new DLCons(value, newPrev, n.updatePrev(result))
result
}
}