341. Flatten Nested List Iterator
Description
You are given a nested list of integers nestedList. Each element is either an integer or a list whose elements may also be integers or other lists. Implement an iterator to flatten it.
Implement the NestedIterator class:
NestedIterator(List<NestedInteger> nestedList)Initializes the iterator with the nested listnestedList.int next()Returns the next integer in the nested list.boolean hasNext()Returnstrueif there are still some integers in the nested list andfalseotherwise.
Constraints
1 <= nestedList.length <= 500The values of the integers in the nested list is in the range
[-106, 106].
Approach
Links
GeeksforGeeks
YouTube
Examples
Input: nestedList = [[1, 1], 2, [1, 1]]
Output: [1, 1, 2, 1, 1]
Explanation: By calling next repeatedly until hasNext returns false, the order of elements returned by next should be: [1, 1, 2, 1, 1].
Input: nestedList = [1, [4, [6]]]
Output: [1, 4, 6]
Explanation: By calling next repeatedly until hasNext returns false, the order of elements returned by next should be: [1, 4, 6].
Solutions
// 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 empty list if this NestedInteger holds a single integer
public List<NestedInteger> getList();
}/**
* Time complexity :
* Space complexity :
*/
public class NestedIterator implements Iterator<Integer> {
private Stack<NestedInteger> stack = new Stack();
public NestedIterator(List<NestedInteger> nestedList) {
if(nestedList == null || nestedList.isEmpty()) {
return;
}
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()) {
NestedInteger top = stack.peek();
if(top.isInteger()) {
return true;
} else {
stack.pop();
List<NestedInteger> topList = top.getList();
for(int i = topList.size()-1; i >= 0; i--) {
stack.push(topList.get(i));
}
}
}
return false;
}
}
/**
* Your NestedIterator object will be instantiated and called as such:
* NestedIterator i = new NestedIterator(nestedList);
* while (i.hasNext()) v[f()] = i.next();
*/Follow up
Last updated
Was this helpful?