How to create Immutable Double Linked List In Scala?

I am trying to create doubly linked list in Scala as an Immutable Doubly LinkedList. My initial code looks like this,

abstract class MyDoublyLinkedList[+A] {

  def head: A
  def previous: MyDoublyLinkedList[A]
  def tail: MyDoublyLinkedList[A]
  def isEmpty: Boolean

  def prepend[B >:A](element: B): MyDoublyLinkedList[B]

}

case object EmptyDoublyLinkedList extends MyDoublyLinkedList[Nothing] {

  override def head: Nothing = throw new NoSuchElementException("No Head for Empty")

  override def previous: MyDoublyLinkedList[Nothing] = throw new NoSuchElementException("No Previous for Empty")

  override def tail: MyDoublyLinkedList[Nothing] = throw new NoSuchElementException("No Next for Empty")

  override def isEmpty: Boolean = true

  override def prepend[B >: Nothing](element: B): MyDoublyLinkedList[B] =
    ConsDoublyLinkedList(element,this, this)
}


case class ConsDoublyLinkedList[+A](h: A, prev: MyDoublyLinkedList[A], t: MyDoublyLinkedList[A]) extends MyDoublyLinkedList[A]{
  override def head: A = h

  override def previous: MyDoublyLinkedList[A] = prev

  override def tail: MyDoublyLinkedList[A] = t

  override def isEmpty: Boolean = false

  override def prepend[B >: A](element: B): MyDoublyLinkedList[B] = {
    val newNode = ConsDoublyLinkedList(element, null, this)
    newNode
  }
}

object MyDoublyLinkedListTest extends App {

  val initialList = ConsDoublyLinkedList(1, EmptyDoublyLinkedList, EmptyDoublyLinkedList)
  println(initialList.prepend(100).prepend(200))
}

Do you guys see any issue in prepend method implementation? One thing I noticed in my test example is that, when I try to prepend 100 to an initialList, initialList's previous is not getting updated with new previous as 100. It stiill shows EmptyDoublyLinkedList. Any useful tips/suggestiions?

Comments (0)