341. 扁平化嵌套列表迭代器
栈
import java.util.Iterator;
import java.util.List;
import java.util.Stack;
class NestedIterator implements Iterator<Integer> {
Stack<NestedInteger> stack = new Stack<>();
public NestedIterator(List<NestedInteger> nestedList) {
/**
* 将原嵌套列表倒序压入栈,这样就可以正序取出来
*/
for (int i = nestedList.size() - 1; i >= 0; i--) {
stack.push(nestedList.get(i));
}
}
/**
* 如果栈中还有元素的话,是整数就直接取出,是嵌套列表就在hasNext()方法中将其解压
*/
@Override
public Integer next() {
return hasNext() ? stack.pop().getInteger() : -1;
}
@Override
public boolean hasNext() {
if (stack.isEmpty()){
return false;
}
if (stack.peek().isInteger()){
return true;
}
else {
/**
* 如果下一个元素是嵌套列表,就和前面一样将其倒序压入栈中
*/
List<NestedInteger> tempList = stack.pop().getList();
for (int i = tempList.size() - 1; i >= 0; i--) {
stack.push(tempList.get(i));
}
/**
* 将嵌套列表解压后,不能直接返回true,因此可能解压后栈就空了,所以需要递归的检查
* 先调用的hasNext(),然后才是next(),如果传入列表是[[]],那么在hasNext()步骤就是false了,结果会是[]而不是[-1]
*/
return hasNext();
}
}
}
/**
* 时间复杂度 O(n)
* 空间复杂度 O(n)
*/
https://leetcode-cn.com/problems/flatten-nested-list-iterator/