284. 顶端迭代器
题目描述:
请你在设计一个迭代器,在集成现有迭代器拥有的 hasNext 和 next 操作的基础上,还额外支持 peek 操作。
实现 PeekingIterator 类:
PeekingIterator(Iterator nums) 使用指定整数迭代器 nums 初始化迭代器。
int next() 返回数组中的下一个元素,并将指针移动到下个元素处。
bool hasNext() 如果数组中存在下一个元素,返回 true ;否则,返回 false 。
int peek() 返回数组中的下一个元素,但 不 移动指针。
注意:每种语言可能有不同的构造函数和迭代器 Iterator,但均支持 int next() 和 boolean hasNext() 函数。
考察重点:此题重点在peek()方法,由于底层使用的是Iterator类(只有hasNext与next方法),要取得当前元素,只能使用Iterator.next(),这会造成指针后移,显然不符合peek()方法的期望。因此我们引入cache变量,调用peek()时,调用next()并使用cache记录当前元素(即当前指针多走了一位);在后续再次调用peek()、next()方法时,指针不再后移(即弥补回来多走的一位)。
class PeekingIterator implements Iterator<Integer> {Iterator<Integer> myIterator;Integer cache = null;public PeekingIterator(Iterator<Integer> iterator) {// initialize any member here.myIterator = iterator;}// Returns the next element in the iteration without advancing the iterator.public Integer peek() {if(cache == null){cache = myIterator.next();}return cache;}// hasNext() and next() should behave the same as in the Iterator interface.// Override them if needed.@Overridepublic Integer next() {if(cache == null){return myIterator.next();}Integer temp = cache;cache = null;return temp;}@Overridepublic boolean hasNext() {if(cache == null){return myIterator.hasNext();}return true;}
}