import java.util.*;
/**
* Google:
* Implement peek() for java iterator()
*
* Example [1,2,3,4,5]
* peek() = 1, peek() = 1, next() = 1, peek() = 2, next() = 2, peek() = 3
* hasNext() = true,
*
* Tags: Data Structures
*/
class PeekIterator<T> implements Iterator<T> {
private final Iterator<T> iterator;
/**
* Store next item
*/
private T nextItem;
public PeekIterator(Iterator<T> iterator) {
this.iterator = iterator;
}
@Override
public boolean hasNext() {
if (nextItem != null) return true; // check next item
if (iterator.hasNext()) nextItem = iterator.next(); // set next item
return nextItem != null;
}
@Override
public T next() {
if (!hasNext()) throw new NullPointerException();
T temp = nextItem;
nextItem = null; // reset next
return temp;
}
public T peek() {
if (!hasNext()) throw new NullPointerException();
return nextItem;
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
}