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?