leetcode [284] - Peeking Iterator
Given an Iterator class interface with methods: next()
and hasNext()
, design and implement a PeekingIterator that support the peek()
operation -- it essentially peek() at the element that will be returned by the next call to next().
Example:
Assume that the iterator is initialized to the beginning of the list:[1,2,3]
. Callnext()
gets you 1, the first element in the list. Now you callpeek()
and it returns 2, the next element. Callingnext()
after that still return 2. You callnext()
the final time and it returns 3, the last element. CallinghasNext()
after that should return false.
题目大意:
实现迭代器的接口方法peek(),next(),hasNext()。该迭代器继承了Iterator迭代器。
理 解:
根据示例,使用peek()方法,返回迭代器当前指向的值,但指针不移动。next()方法和hasNext()与普通迭代器方法一样。
当调用peek()方法时,使用next()方法获得指针的值,在下次调用next()操作时返回peek()获取的值即可实现。
使用flag标记上一个迭代器操作是否为peek,即判断指针真实所指的位置。
需要注意的是,根据flag对三个方法真实指针的位置做出判断,返回相应函数值。
[开始没想出来,和同学讨论后才做出来的。后面还要继续加油!]
代码C++:
// 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 _peek; int flag; 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. flag = 0; } // Returns the next element in the iteration without advancing the iterator. int peek() { if(flag==0){ _peek = Iterator::next(); flag = 1; return _peek; }else{ return _peek; } } // hasNext() and next() should behave the same as in the Iterator interface. // Override them if needed. int next() { if(flag==1){ flag=0; return _peek; }else{ return Iterator::next(); } } bool hasNext() const { if(flag==0){ return Iterator::hasNext(); }else{ return true; } } };