[设计] 284. 顶端迭代器(改造Iterator:辅助队列 → 预存next的返回值)

[设计] 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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值