Skip to content

Latest commit

 

History

History
61 lines (46 loc) · 1.74 KB

284. Peeking Iterator.md

File metadata and controls

61 lines (46 loc) · 1.74 KB

思路

我们有了一个只支持nexthasNext方法的迭代器类,让我们实现一个子类,要求增添一个peek方法。

思路一

我们想实现的peek是只返回当前元素而不考虑指针后移。但每次调用基类的next时,返回当前元素后都会后移指针。那么我们可以考虑用一个变量value在调用基类的next时缓存当前元素,这样的话即使指针后移了,我们调用peek时也能直接返回value。为此我们需要一个bool变量flag来指示value是否存放了在之后调用peeknext应该返回的值。

思路二

还有一个比较tricky的方法:peek时创建一个当前指针对应的副本,由于是局部变量,所以调用结束后会被销毁,所以并没有任何内存问题。

C++

思路一

class PeekingIterator : public Iterator {
private:
    bool flag;
    int value;
    
public:
    PeekingIterator(const vector<int>& nums) : Iterator(nums) {
	flag = false; // value是否存放了peek和next应该返回的值
    }
	
    int peek(){
        if(!flag) value = Iterator::next();
        flag = true;
        return value;
    }

    int next() {
        if(!flag) return Iterator::next();
        flag = false;
        return value;
    }

    bool hasNext() const {
        return flag || Iterator::hasNext();
    }
};

思路二

class PeekingIterator : public Iterator {
public:
    PeekingIterator(const vector<int>& nums) : Iterator(nums) {}
	
    int peek(){
        // 调用Iterator(const Iterator& iter)创造一个副本
        return Iterator(*this).next();
    }

//     int next() {} 
//     bool hasNext() const {}
};