341. 扁平化嵌套列表迭代器
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]。
二、解题思路
1、解题思路
在类中添加
nestedList、stack、iteratot、integer四个属性,分别对应嵌套列表、迭代器存储栈、当前迭代器、当前遍历整数构造函数初始化
nestedList、iterator,iterator对应的就是构造参数的迭代器。重写
hasNext()函数,主要逻辑为:当前迭代器若
hasNext()为true- 判断
next()是否为整数,若为整数则赋值integer,返回``true` - 判断
next()是否为列表,则将当前迭代器暂存至stack,并更新iterator为当前列表的迭代器,递归hasNext()函数
- 判断
当前迭代器若
hasNext()为false且stack非空,则迭代器出栈更新为当前iterator,递归hasNext()函数其他情况则代表,整个扁平化嵌套列表已遍历完毕,返回
false
重写
next()函数,迭代器的使用规则是hasNext()返回为true时调用next()函数获取下一值,再次直接返回integer(当前遍历整数)即可。
2、代码
// interface NestedInteger {
// public boolean isInteger();
// public Integer getInteger();
// public List<NestedInteger> getList();
// }
public class NestedIterator implements Iterator<Integer> {
//嵌套列表
private List<NestedInteger> nestedList = null;
//迭代器存储栈
private Stack<Iterator<NestedInteger>> stack = new Stack<>();
//当前迭代器
private Iterator<NestedInteger> iterator = null;
//当前遍历整数
private Integer integer = 0;
public NestedIterator(List<NestedInteger> nestedList) {
//嵌套列表初始化
this.nestedList = nestedList;
iterator = nestedList.iterator();
}
@Override
public Integer next() {
return integer;
}
@Override
public boolean hasNext() {
if(iterator.hasNext()) {
NestedInteger nestedInteger = iterator.next();
if (!nestedInteger.isInteger()) {
//该值为列表
stack.push(iterator);
iterator = nestedInteger.getList().iterator();
return hasNext();
} else {
integer = nestedInteger.getInteger();
return true;
}
}else if(!iterator.hasNext() && !stack.isEmpty()) {
//当前迭代器至列表末尾并且栈非空
//迭代器更新为上一级
iterator = stack.pop();
return hasNext();
}else{
return false;
}
}
} LeetCode题解 文章被收录于专栏
收录leetcode题解,专注于算法练习。
