leetcode 每日一题 2021/10/5 284. 顶端迭代器
难度:中等
请你设计一个迭代器,除了支持 hasNext 和 next 操作外,还支持 peek 操作。
实现 PeekingIterator 类:
- PeekingIterator(int[] nums) 使用指定整数数组 nums 初始化迭代器。
- int next() 返回数组中的下一个元素,并将指针移动到下个元素处。
- bool hasNext() 如果数组中存在下一个元素,返回 true ;否则,返回 false 。
- int peek() 返回数组中的下一个元素,但 不 移动指针。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/peeking-iterator
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
分析:
-
PeekingIterator初始化迭代器,即将指针指向初始位置, 数组长度是大于等于1的(提示信息中)。
-
next(),即如果数组不为空第一次返回的是第1个数。假设数组中有2个数,最开始调用next() 返回arr[0],并且指针将会移动打next[1]处。
-
hasNext()直接调用就行。
-
peek()直接返回当前指针所指的值。
易错点:
注意看题目的提示。
第一次调用next()返回的是第一个元素,而不是第二个元素。
// * 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& nums);
// Iterator(const Iterator& iter);
// // Returns the next element in the iteration.
// int next();
// // Returns true if the iteration has more elements.
// bool hasNext() const;
// };
class PeekingIterator : public Iterator {
public:
int nextValue;//相当于是指向下一个的指针
bool flag;//判断nextValue是否存在
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.
//初始化迭代器:即指针指向初始位置,next是第一个元素
flag = Iterator::hasNext();
if(flag){
nextValue = Iterator::next();
}
}
// Returns the next element in the iteration without advancing the iterator.
int peek() {
return nextValue;
}
// hasNext() and next() should behave the same as in the Iterator interface.
// Override them if needed.
int next() {
int tempValue = nextValue;
flag = Iterator::hasNext();
if(flag){
nextValue=Iterator::next();
}
return tempValue;
}
bool hasNext() const{
return flag;
}
};