Dedup LinkedList
Write code to remove duplicates from an unsorted linked list
FOLLOW UPHow would you solve this problem if a temporary buffer is not allowed
trait Node {
def value: Int
def next: Node
}
object Empty extends Node {
def value: Int = throw new Error("access empty variable")
def next: Node = throw new Error("access empty variable")
}
case class NonEmpty(value: Int, next: Node = null) extends Node
def toLinkedList(lst: List[Int]): Node = {
if (lst.isEmpty) Empty
else new NonEmpty(lst.head, toLinkedList(lst.tail))
}
def printLinkedList(head: Node): Unit = head match {
case Empty =>
case node: NonEmpty => {
println(node.value)
printLinkedList(node.next)
}
}
/**
* 2.1
*
* @param head
* @return
*/
def deduplicate(head: Node): Node = {
val dict = scala.collection.mutable.Map[Int, Boolean]()
def dedup(node: Node): Node = {
node match {
case Empty => Empty
case current: NonEmpty => {
dict.get(current.value) match {
case Some(value) => dedup(current.next)
case None => {
dict += (current.value -> true)
new NonEmpty(current.value, dedup(current.next))
}
}
}
}
}
dedup(head)
}
var node = toLinkedList(List(1, 2, 3, 4, 4, 5, 6, 6))
printLinkedList(deduplicate(node))