题目描述(中等难度)

给迭代器增加一个 peek 功能,也就是查看下一个元素,但是不从迭代器中弹出。

解法一

我第一反应是直接把迭代器的元素放到 list 中不就实现了吗?

class PeekingIterator implements Iterator<Integer> {
    List<Integer> list;
    int cur = 0;

    public PeekingIterator(Iterator<Integer> iterator) {
        // initialize any member here.
        list = new ArrayList<>();
        while (iterator.hasNext())
            list.add(iterator.next());

    }

    // Returns the next element in the iteration without advancing the iterator.
    public Integer peek() {
        return list.get(cur);
    }

    // hasNext() and next() should behave the same as in the Iterator interface.
    // Override them if needed.
    @Override
    public Integer next() {
        return list.get(cur++);
    }

    @Override
    public boolean hasNext() {
        return cur < list.size();
    }
}

解法二

解法一还真的通过了,觉得自己没有 get 题目的点,然后去逛 Discuss 了,原来题目想让我们这样做,分享 这里 的代码。

我们知道构造函数传进来的迭代器已经有了 nexthaseNext 函数,我们需要增加 peek 函数。我们可以加一个缓冲变量,记录当前要返回的值。

peek 的话只需要将缓冲变量直接返回。

next 的话我们需要更新缓冲变量,然后将之前的缓冲变量返回即可。

class PeekingIterator implements Iterator<Integer> {  
    private Integer next = null;//缓冲变量
    private Iterator<Integer> iter;

    public PeekingIterator(Iterator<Integer> iterator) {
        // initialize any member here.
        iter = iterator;
        if (iter.hasNext()){
             next = iter.next();
        }

    }

    // Returns the next element in the iteration without advancing the iterator. 
    public Integer peek() {
        return next; 
    }

    // hasNext() and next() should behave the same as in the Iterator interface.
    // Override them if needed.
    @Override
    public Integer next() {
        Integer res = next;
        next = iter.hasNext() ? iter.next() : null;
        return res; 
    }

    @Override
    public boolean hasNext() {
        return next != null;
    }
}

其实是比较简单的一道题,用到的思想也比较简单,增加了一个缓冲变量来实现 peek 的功能。

results matching ""

    No results matching ""