This problem was asked by Google.

Given an iterator with methods next() and hasNext(), create a wrapper iterator, PeekableInterface, which also implements peek(). peek shows the next element that would be returned on next().

Here is the interface:

class PeekableInterface(object):
    def __init__(self, iterator):
        pass

    def peek(self):
        pass

    def next(self):
        pass

    def hasNext(self):
        pass

My Solution(Python):



class PeekableInterface(object):
    def __init__(self, iterator):
        self.iterator = iterator
        try:
            self._nextVal = iterator.__next__()
            self._hasNextVal = True
        except StopIteration:
            self._nextVal = None
            self._hasNextVal = False

    def peek(self):
        return self._nextVal

    def next(self):
        next = self._nextVal
        try:
            self._nextVal = self.iterator.__next__()
            self._hasNextVal = True
        except StopIteration:
            next = self._nextVal= None
            self._hasNextVal = False
        return next

    def hasNext(self):
        return self._hasNextVal


def main():
    A = [3, 5, 8]
    itr = iter(A)
    p = PeekableInterface(itr)
    print(p.hasNext()) #true
    print(p.peek()) #3
    print(p.peek()) #3
    print(p.next()) #3
    print(p.hasNext()) #true
    print(p.peek()) #5
    print(p.next()) #5
    print(p.hasNext()) #true
    print(p.peek()) #8
    print(p.next()) #8
    print(p.hasNext()) #false
    print(p.peek()) #None
    print(p.next()) #None

if __name__=='__main__':
    main()