1 // Java Iterator interface reference: 2 // https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html 3 class PeekingIterator implements Iterator<Integer> { 4 private Integer peekElement; 5 private boolean hasPeeked; 6 private Iterator<Integer> iterator; 7 8 public PeekingIterator(Iterator<Integer> iterator) { 9 // initialize any member here. 10 this.iterator = iterator; 11 hasPeeked = false; 12 } 13 14 // Returns the next element in the iteration without advancing the iterator. 15 public Integer peek() { 16 if (!hasPeeked) { 17 hasPeeked = true; 18 peekElement = iterator.next(); 19 } 20 return peekElement; 21 } 22 23 // hasNext() and next() should behave the same as in the Iterator interface. 24 // Override them if needed. 25 @Override 26 public Integer next() { 27 if (!hasPeeked) { 28 return iterator.next(); 29 } 30 hasPeeked = false; 31 return peekElement; 32 } 33 34 @Override 35 public boolean hasNext() { 36 return hasPeeked || iterator.hasNext(); 37 } 38 }