给你一个嵌套的整型列表。请你设计一个迭代器,使其能够遍历这个整型列表中的所有整数。列表中的每一项或者为一个整数,或者是另一个列表。其中列表的元素也可能是整数或是其他列表。
示例 1:
输入: [[1,1],2,[1,1]]
输出: [1,1,2,1,1]
解释: 通过重复调用 next 直到 hasNext 返回 false,next 返回的元素的顺序应该是: [1,1,2,1,1]
方法一:递归(N叉树遍历思想)
public class NestedIterator implements Iterator<Integer> {
public Iterator<Integer> it;
public NestedIterator(List<NestedInteger> nestedList) {
//存放将nestedList打平的结果
List<Integer> result = new LinkedList<>();
for(NestedInteger node : nestedList){
//以每个根节点为根遍历
traverse(node,result);
}
//得到result列表的迭代器
this.it = result.iterator();
}
@Override
public Integer next() {
return it.next();
}
@Override
public boolean hasNext() {
return it.hasNext();
}
public void traverse(NestedInteger root,List<Integer> result){
if(root.isInteger()){
//到达叶子节点
result.add(root.getInteger());
return ;
}
//遍历框架
for(NestedInteger child : root.getList()){
traverse(child,result);
}
}
}
方法二:迭代
public class NestedIterator implements Iterator<Integer> {
private LinkedList<NestedInteger> list;
public NestedIterator(List<NestedInteger> nestedList) {
//不直接用nestedList的引用,是因为不能确定它的底层实现
//必须保证是LinkedList,否则下面的addFirst会很低效
list = new LinkedList<>(nestedList);
}
@Override
public Integer next() {
//hasNext方法保证; 第一个元素一定是整数类型
return list.remove(0).getInteger();
}
@Override
public boolean hasNext() {
//循环拆分列表元素,直到列表第一个元素是整数类型
while(!list.isEmpty() && !list.get(0).isInteger()){
//当列表第一个元素是列表类型时,进入循环
List<NestedInteger> first = list.remove(0).getList();
//将第一个列表打平并按顺序添加到开头
for(int i = first.size()-1;i >= 0; i--){
list.addFirst(first.get(i));
}
}
return !list.isEmpty();
}
}