Thinking process I - queue + dfs
parse and store all the elements into queue
not very memory efficient if list is very large or nested a lot
public class NestedIterator implements Iterator<Integer> {
private Queue<Integer> queue;
public NestedIterator(List<NestedInteger> nestedList) {
queue = new ArrayDeque<>();
addElements(nestedList);
}
@Override
public Integer next() {
return queue.poll();
}
@Override
public boolean hasNext() {
return !queue.isEmpty();
}
private void addElements(List<NestedInteger> list) {
for (NestedInteger ni : list) {
if (ni.isInteger()) {
queue.offer(ni.getInteger());
} else {
addElements(ni.getList());
}
}
}
}
Thinking process II - stack
public class NestedIterator implements Iterator<Integer> {
private Stack<NestedInteger> stack;
public NestedIterator(List<NestedInteger> nestedList) {
stack = new Stack<>();
for (int i = nestedList.size() - 1; i >= 0; --i) {
stack.push(nestedList.get(i));
}
}
@Override
public Integer next() {
return stack.pop().getInteger();
}
@Override
public boolean hasNext() {
while (!stack.isEmpty() && !stack.peek().isInteger()) {
List<NestedInteger> list = stack.pop().getList();
for (int i = list.size() - 1; i >= 0; --i) {
stack.push(list.get(i));
}
}
return !stack.isEmpty();
}
}