class Stack { class Node(v: T) { val value: T = v var next: Node? = null } var head: Node? = null var length: Int = 0 private set fun push(v: T) { var newNode = Node(v) newNode.next = head head = newNode length++ } fun pop(): T? { val popper = head ?: return null // immutable shadow val retval: T = popper.value head = popper.next length-- return retval } fun isEmpty(): Boolean = length == 0 fun print() { var current: Node? = head print ("[") while (current != null) { print(current.value) current = current.next if (current != null) print(", ") } println("]") } } fun main() { val s: Stack = Stack() s.push(1) s.push(2) s.push(3) s.print() while(s.length > 0) println(s.pop()) }