341. Flatten Nested List Iterator
Medium (Google, Facebook, Twitter)
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 the list [[1,1],2,[1,1]],
By calling next repeatedly until hasNext returns false, the order of elements returned by next should be: [1,1,2,1,1].
Example 2: Given the list [1,[4,[6]]],
By calling next repeatedly until hasNext returns false, the order of elements returned by next should be: [1,4,6].
/**
- // This is the interface that allows for creating nested lists.
- // You should not implement it, or speculate about its implementation
- public interface NestedInteger { *
- // @return true if this NestedInteger holds a single integer, rather than a nested list.
- public boolean isInteger(); *
- // @return the single integer that this NestedInteger holds, if it holds a single integer
- // Return null if this NestedInteger holds a nested list
- public Integer getInteger(); *
- // @return the nested list that this NestedInteger holds, if it holds a nested list
- // Return null if this NestedInteger holds a single integer
- public List
getList(); - } */
public class NestedIterator implements Iterator {
// test case:
// input is empty, but will call the function hasNext() or next()
private Stack<NestedInteger> stack = new Stack();
private NestedInteger current = null;
public NestedIterator(List<NestedInteger> nestedList) {
if(nestedList == null || nestedList.size() == 0) {
return ;
}
for(int i = nestedList.size() - 1; i >= 0; i--) {
stack.push(nestedList.get(i));
}
}
@Override
public Integer next() {
if(hasNext() == true) {
return stack.pop().getInteger();
} else {
return -1;
}
}
@Override
public boolean hasNext() {
while(!stack.isEmpty()) {
current = stack.peek();
if(current.isInteger()) {
return true;
} else {
stack.pop();
List<NestedInteger> list = current.getList();
for(int i = list.size() - 1; i >= 0; i--) {
stack.push(list.get(i));
}
}
}
return false;
}