[设计] 284. 顶端迭代器(改造Iterator:辅助队列 → 预存next的返回值)
284. 顶端迭代器
题目链接:https://leetcode-cn.com/problems/peeking-iterator/solution/
分类:
- 设计:基于Iterator的基本函数,设计一个peek函数(辅助队列(思路1) → 预存next返回值(思路2))
题目分析
本题需要在Iterator提供的next,hasNext函数中增加一个peek函数,next()和peek()的区别在于next()返回头部元素后头部元素会被删除,而peek()返回头部元素后钙元素并不会被删除。
- 思路1引入了辅助队列,将所有元素都转存到队列中,我们希望构造的peek函数就是队列的peek函数;
- 思路2不需要辅助队列,将头部元素预先弹出并记录在备份变量cur中,调用peek就返回cur,调用next也返回cur,但同时更新cur为下一个头部,为后续的操作做准备。
思路1:辅助队列(空间 O(N))
使用一个辅助队列,先将迭代器的所有元素都转存到队列中,这里使用LinkedList作为队列,则next函数就是poll函数,hasNext就是队列的isEmpty函数,peek就是队列的peek。
class PeekingIterator implements Iterator<Integer> {
Queue<Integer> queue;
public PeekingIterator(Iterator<Integer> iterator) {
// initialize any member here.
queue = new LinkedList<>();
while(iterator.hasNext()){
queue.offer(iterator.next());
}
}
// Returns the next element in the iteration without advancing the iterator.
public Integer peek() {
return queue.peek();
}
// hasNext() and next() should behave the same as in the Iterator interface.
// Override them if needed.
@Override
public Integer next() {
return queue.poll();
}
@Override
public boolean hasNext() {
return !queue.isEmpty();
}
}
- 空间复杂度:O(N),使用到了辅助队列。
思路2:预存next()的返回值(空间 O(1))
不需要使用辅助队列,而是使用一个变量cur预先把迭代器next()的返回值保存起来,调用peek就返回cur,调用next也返回cur,但同时更新cur为下一个头部,为后续的操作做准备。
cur变量声明时,cur=null;
- 初始化时就将迭代器next()的值赋给cur。
- peek:直接返回cur;
- next:同样返回cur,但同时将下一个next赋给cur,如果迭代器不再有next元素,则置cur为null;
- hasNext:只有cur==null和!hasNext()同时满足才说明没有下一个元素,返回false,其他情况返回true,所以hasNext()整理为:return iterator.hasNext() || cur != null;
class PeekingIterator implements Iterator<Integer> {
Iterator<Integer> iterator;
Integer cur = null;
public PeekingIterator(Iterator<Integer> iterator) {
// initialize any member here.
this.iterator = iterator;
if(iterator.hasNext()) cur = iterator.next();
}
// Returns the next element in the iteration without advancing the iterator.
public Integer peek() {
return cur;
}
// hasNext() and next() should behave the same as in the Iterator interface.
// Override them if needed.
@Override
public Integer next() {
Integer ret = cur;
if(iterator.hasNext()) cur = iterator.next();
else cur = null;
return ret;
}
@Override
public boolean hasNext() {
return iterator.hasNext() || cur != null;
}
}
- 空间复杂度:O(1)