题目: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]。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/flatten-nested-list-iterator
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
该题是一个嵌套递归的问题,列表中的元素可能是一个int,也可能是一个列表,如此不断循环。很容易想到使用递归的方式,深度优先搜索,就类似树的结构,树上的叶子数就是int数据,而列表就像树的结构。
实际代码实现的时候,可以在构造函数里将所有元素存入数组,即完成一次树的深度优先搜索。在访问元素时,定义一个指针,每次指向当前元素,随着上次访问向下偏移。
解题代码
class NestedIterator {
public:
NestedIterator(vector<NestedInteger>& nestedList) {
DFs(nestedList);
cur = nums.begin();
}
int next() {
return *cur++;
}
bool hasNext() {
return cur != nums.end();
}
private:
vector<int> nums;
vector<int>::iterator cur;
void DFs(const vector<NestedInteger>& list)//循环整个vector<NestedInteger>
{
for(auto& data : list)
{
if(data.isInteger())//如果是int
{
nums.push_back(data.getInteger());
}
else
{
DFs(data.getList());
}
}
}
};
解题感悟
虽然一开始想到利用递归算法,但是实际操作时还是容易困惑。这题的关键是递归整个列表,通过判断是否为int决定是否加入元素或者继续递归下一个列表。