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 nestedList) Initializes the iterator with the nested list nestedList.
int next() Returns the next integer in the nested list.
boolean hasNext() Returns true if there are still some integers in the nested list and false otherwise.
Your code will be tested with the following pseudocode:
initialize iterator with nestedList
res = []
while iterator.hasNext()
append iterator.next() to the end of res
return res
If res matches the expected flattened list, then your code will be judged as correct.
Example 1:
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].
有一个NestedInteger类型的List,这个NestedInteger元素可以是Integer,也可以是List,
相当于NestedInteger嵌套NestedInteger,List嵌套List。
要实现HasNext() 和 next(),
题目测试的时候在hasNext()时会不停的调用next(),得到nestedList中的所有元素。
思路:
在构造函数时把nestedList中的元素都保存到一个list中,
在next()时返回下一元素即可。
ArrayList在添加元素扩容时开销比较大,所以选择LinkedList。
添加元素时由于List中还有List,所以用递归。
另外,List中的元素类型NestedInteger是自定义类型,要用到代码中提示的方法,
比如说取出List中的Integer不是简单的list.get(i),而是list.get(i).getInteger()。
/**
* // 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();
* }
*/
public class NestedIterator implements Iterator<Integer> {
LinkedList<Integer> list = new LinkedList<>();
public NestedIterator(List<NestedInteger> nestedList) {
addElement(nestedList);
}
@Override
public Integer next() {
return list.pollFirst();
}
@Override
public boolean hasNext() {
return list.size() > 0;
}
void addElement(List<NestedInteger> nestedList) {
for(int i = 0; i < nestedList.size(); i ++) {
if(nestedList.get(i).isInteger()) {
list.add(nestedList.get(i).getInteger());
} else {
addElement(nestedList.get(i).getList());
}
}
}
}