package LeetCode_284 /** * 284. Peeking Iterator * https://leetcode.com/problems/peeking-iterator/ * Design an iterator that supports the peek operation on a list in addition to the hasNext and the next operations. Implement the PeekingIterator class: PeekingIterator(int[] nums): Initializes the object with the given integer array nums. int next(): Returns the next element in the array and moves the pointer to the next element. bool hasNext(): Returns true if there are still elements in the array. int peek(): Returns the next element in the array without moving the pointer. * */ // Kotlin Iterator reference: // https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-iterator/ class PeekingIterator(iterator: Iterator<Int>) : Iterator<Int> { private var isDone = false private var it: Iterator<Int>? = null private var next: Int = 0 init { it = iterator if (iterator.hasNext()){ next = iterator.next() } else { isDone = true } } fun peek(): Int { return next } override fun next(): Int { //return value and move the pointer val result = next if (it?.hasNext()!!) { next = it?.next()!! } else { isDone = true } return result } override fun hasNext(): Boolean { return !isDone } } /** * Your PeekingIterator object will be instantiated and called as such: * var obj = PeekingIterator(arr) * var param_1 = obj.next() * var param_2 = obj.peek() * var param_3 = obj.hasNext() */