What happens when we try to modify a list value? As before, copying and sharing kicks in to make the data structure persistent.
We changed the fourth node's value from 17 to 97. To keep the persistent view correct, for V1, we had to copy all the nodes on the path leading up to the modified node.
On the other hand, nodes on all other paths are shared. The case with node deletion is also the same.
Note that the copying process is the same as the earlier node modification case.
The insertion case would be similar as well. Play with the scenario where we add node 52 after the second node with value 99:
scala> def setElem[A](l: List[A], i: Int, elem: A): List[A] = (l, i) match { | case (Nil, _) => sys.error(s"index ${i} not valid") | case (_ :: xs, 0) => ::(elem, xs) | case (x :: xs, _) => ::(x, setElem(xs, i-1, elem)) | } scala> val l = List(12, 99, 37, 17, 199, 337) l: ch02.mylist.List...