LeetCode Solutions
284. Peeking Iterator
Time: $O(1)$ Space: $O(n)$
class PeekingIterator : public Iterator {
public:
PeekingIterator(const vector<int>& nums) : Iterator(nums) {}
// Returns the next element in the iteration without advancing the iterator.
int peek() {
// Iterator(*this) makes a copy of current iterator, then call next on the
// Copied iterator to get the next value without affecting current iterator
return Iterator(*this).next();
}
// hasNext() and next() should behave the same as in the Iterator interface.
// Override them if needed.
int next() {
return Iterator::next();
}
bool hasNext() const {
return Iterator::hasNext();
}
};
// Java Iterator interface reference:
// Https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html
class PeekingIterator implements Iterator<Integer> {
public PeekingIterator(Iterator<Integer> iterator) {
this.iterator = iterator;
buffer = iterator.hasNext() ? iterator.next() : null;
}
// Returns the next element in the iteration without advancing the iterator.
public Integer peek() {
return buffer;
}
// hasNext() and next() should behave the same as in the Iterator interface.
// Override them if needed.
@Override
public Integer next() {
Integer next = buffer;
buffer = iterator.hasNext() ? iterator.next() : null;
return next;
}
@Override
public boolean hasNext() {
return buffer != null;
}
private Iterator<Integer> iterator;
private Integer buffer;
}
class PeekingIterator:
def __init__(self, iterator: Iterator):
self.iterator = iterator
self.buffer = self.iterator.next() if self.iterator.hasNext() else None
def peek(self) -> int:
"""
Returns the next element in the iteration without advancing the iterator.
"""
return self.buffer
def next(self) -> int:
next = self.buffer
self.buffer = self.iterator.next() if self.iterator.hasNext() else None
return next
def hasNext(self) -> bool:
return self.buffer is not None