Leetcode 284 Solution

This article provides solution to leetcode question 284 (peeking-iterator)

https://leetcode.com/problems/peeking-iterator

Solution

// Below is the interface for Iterator, which is already defined for you.
// **DO NOT** modify the interface for Iterator.
class Iterator {
    struct Data;
	Data* data;
public:
	Iterator(const vector<int>& nums);
	Iterator(const Iterator& iter);
	virtual ~Iterator();
	// Returns the next element in the iteration.
	int next();
	// Returns true if the iteration has more elements.
	bool hasNext() const;
};


class PeekingIterator : public Iterator {
    int m_next;
    bool m_peeked;

public:
	PeekingIterator(const vector<int>& nums) : Iterator(nums) {
	    // Initialize any member here.
	    // **DO NOT** save a copy of nums and manipulate it directly.
	    // You should only use the Iterator interface methods.
	    m_peeked = false;
	}

    // Returns the next element in the iteration without advancing the iterator.
	int peek() {
        if (m_peeked)
            return m_next;
        else
        {
            m_next = Iterator::next();
            m_peeked = true;
            return m_next;
        }
	}

	// hasNext() and next() should behave the same as in the Iterator interface.
	// Override them if needed.
	int next() {
	    if (m_peeked)
	    {
	        m_peeked = false;
	        return m_next;
	    }
	    else
	    {
	        return Iterator::next();
	    }
	}

	bool hasNext() const {
	    if (m_peeked)
	    {
	        return true;
	    }
	    else
	    {
	        return Iterator::hasNext();
	    }
	}
};