341. 扁平化嵌套列表迭代器
给你一个嵌套的整型列表。请你设计一个迭代器,使其能够遍历这个整型列表中的所有整数。
列表中的每一项或者为一个整数,或者是另一个列表。其中列表的元素也可能是整数或是其他列表。
示例 1:
输入: [[1,1],2,[1,1]]
输出: [1,1,2,1,1]
解释: 通过重复调用 next 直到 hasNext 返回 false,next 返回的元素的顺序应该是: [1,1,2,1,1]。
示例 2:
输入: [1,[4,[6]]]
输出: [1,4,6]
解释: 通过重复调用 next 直到 hasNext 返回 false,next 返回的元素的顺序应该是: [1,4,6]。
运行结果
解题思路
可以想象该结构的实现为一个N叉树
初始化是为了实现保证list为一个LinkedList结构
hasNext:获取第一个元素,如果第一个为列表,则将列表平铺,依次递归,直到最后递归的第一个元素为整数
Next:已经保证了第一个元素是整数,则直接返回就行
java代码
/** * // 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 null if this NestedInteger holds a single integer * public List<NestedInteger> getList(); * } */ 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(); } } /** * Your NestedIterator object will be instantiated and called as such: * NestedIterator i = new NestedIterator(nestedList); * while (i.hasNext()) v[f()] = i.next(); */