原题链接:341. 扁平化嵌套列表迭代器
解题思路:
- 输入:
nestedList=[[1,1],2,[1,1]]
时,nestedList[0]
也是一个NestedInteger
类型,只是nestedList[0].getInteger() === null
。 - 可以将
nestedList
当做一个树,每个节点可以通过getInteger
方法获取当前值,通过getList
方法获取下一层节点。 - 使用
DFS
,先搜索出树的所有节点的值,将值都存入数组。 - 使用一个指针
index
,始终指向next
对应的取值位置。每次调用next
,都将指针向后移动一位。如果index
指向类型为number
,hasNext
返回true
。
/**
* @constructor
* @param {NestedInteger[]} nestedList
*/
var NestedIterator = function (nestedList) {
this.list = []; // 使用数组存储每个节点的值
this.index = 0; // 用一个指针,始终指向下一个元素
// 使用DFS,搜索所有结果,并进行初始化
const dfs = (nestedList) => {
// 遍历数组的每个元素
for (const nestedInteger of nestedList) {
// 获取当前元素的值
const value = nestedInteger.getInteger();
// 若当前值存在,则将其存入数组
if (typeof value === 'number') {
this.list.push(value);
}
// 继续搜索下一级元素列表
dfs(nestedInteger.getList());
}
};
// 搜索nestedList
dfs(nestedList);
};
/**
* @this NestedIterator
* @returns {boolean}
*/
NestedIterator.prototype.hasNext = function () {
// 如果指针对应的值类型为number,表示下一项存在,否则为undefined
return typeof this.list[this.index] === 'number';
};
/**
* @this NestedIterator
* @returns {integer}
*/
NestedIterator.prototype.next = function () {
// 将当前值返回,并向后移动指针
return this.list[this.index++];
};