[LeetCode] Peeking Iterator

简介: Given an Iterator class interface with methods: next() and hasNext(), design and implement a PeekingIterator that support the peek() operation – it essentially peek() at the element that wi

Given an Iterator class interface with methods: next() and hasNext(), design and implement a PeekingIterator that support the peek() operation – it essentially peek() at the element that will be returned by the next call to next().

Here is an example. Assume that the iterator is initialized to the beginning of the list: [1, 2, 3].

Call next() gets you 1, the first element in the list.

Now you call peek() and it returns 2, the next element. Calling next() after that still return 2.

You call next() the final time and it returns 3, the last element. Calling hasNext() after that should return false.

Hint:

  1. Think of “looking ahead”. You want to cache the next element.
  2. Is one variable sufficient? Why or why not?
  3. Test your design with call order of peek() before next() vs next() before peek().
  4. For a clean implementation, check out Google’s guava library source code.

解题思路

用一个变量来保存peek元素值,每次调用next()peek()时更新其值。

实现代码

Java:

// Runtime: 120 ms
//Java Iterator interface reference:
//https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html
class PeekingIterator implements Iterator<Integer> {
    Integer peek = null;
    private Iterator<Integer> iterator;
    public PeekingIterator(Iterator<Integer> iterator) {
        this.iterator = iterator;
    }

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

    // hasNext() and next() should behave the same as in the Iterator interface.
    // Override them if needed.
    @Override
    public Integer next() {
        if (peek == null) {
            return iterator.next();
        }
        else {
            Integer temp = peek;
            peek = null;
            return temp;
        }
    }

    @Override
    public boolean hasNext() {
        if (peek != null) {
            return true;
        }
        else {
            return iterator.hasNext();
        }
    }
}
目录
相关文章
LeetCode 341. Flatten Nested List Iterator
给定一个嵌套的整型列表。设计一个迭代器,使其能够遍历这个整型列表中的所有整数。 列表中的项或者为一个整数,或者是另一个列表。
69 0
LeetCode 341. Flatten Nested List Iterator
|
存储
LeetCode 284. Peeking Iterator
给定一个迭代器类的接口,接口包含两个方法: next() 和 hasNext()。设计并实现一个支持 peek() 操作的顶端迭代器 -- 其本质就是把原本应由 next() 方法返回的元素 peek() 出来。
83 0
LeetCode 284. Peeking Iterator
[LeetCode] Design Compressed String Iterator 设计压缩字符串的迭代器
Design and implement a data structure for a compressed string iterator. It should support the following operations: next and hasNext.
1253 0
[LeetCode] Flatten Nested List Iterator
Given a nested list of integers, implement an iterator to flatten it. Each element is either an integer, or a list – whose elements may also be integers or other lists. Example 1: Given
1757 0
|
C++
[LeetCode] Peeking Iterator
An interesting problem about iterators. This post shares a very nice solution, which is rewritten below, with minor simplifications.
769 0
[LeetCode] Zigzag Iterator
Problem Description: Given two 1d vectors, implement an iterator to return their elements alternately.
800 0