// @return true if this NestedInteger holds a single integer, rather than a nested list. publicbooleanisInteger();
// @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<NestedInteger> getList(); }
/** * use Java Iterator */ publicclassNestedIteratorimplementsIterator<Integer> {
private Iterator<Integer> iterator;
publicNestedIterator(List<NestedInteger> nestedList){ List<Integer> list = new ArrayList<>(); for (NestedInteger node : nestedList) { DFS(node, list); } this.iterator = list.iterator(); // all the operation use list's iterator }
@Override public Integer next(){ return iterator.next(); }
/** * DFS get every element into List res; */ privatevoidDFS(NestedInteger node, List<Integer> res){ if (node.isInteger()) { res.add(node.getInteger()); return; } for (NestedInteger child : node.getList()) { DFS(child, res); } }
/** * DFS the nestedList, offer the elements into the queue */ privatevoidDFS(List<NestedInteger> nestedList){ for (NestedInteger elem : nestedList) { if (elem.isInteger()) { // elem is Integer, offer the queue queue.addLast(elem.getInteger()); } else { // elem is List, DFS the list and offer the elements into queue DFS(elem.getList()); } } }
@Override publicbooleanhasNext(){ if (stack.isEmpty()) { returnfalse; } else { // stack not empty, judge the peek elem's type(List/Integer) NestedInteger elem = stack.peek(); if (elem.isInteger()) { returntrue; } else { // peek elem is list, iterate the list to push elem into the stack elem = stack.pop(); List<NestedInteger> list = elem.getList(); for (int i = list.size() - 1; i >= 0; i--) { stack.push(list.get(i)); } return hasNext(); } } }