LeetCode: 341. Flatten Nested List Iterator
Given a nested list of integers, implement an iterator to flatten it.
Each element is either an integer, or a list – whose elements may also be integers or other lists.
Example 1:
Given the list [[1,1],2,[1,1]],
By calling next repeatedly until hasNext returns false, the order of elements returned by next should be: [1,1,2,1,1].
Example 2:
Given the list [1,[4,[6]]],
By calling next repeatedly until hasNext returns false, the order of elements returned by next should be: [1,4,6].
1、对于list的处理:用栈一层一层读取后保存在队列中。
2、在判断下一个还有没有时候,处理好list。
/**
* // This is the interface that allows for creating nested lists.
* // You should not implement it, or speculate about its implementation
* class NestedInteger {
* public:
* // Return true if this NestedInteger holds a single integer, rather than a nested list.
* bool isInteger() const;
*
* // Return the single integer that this NestedInteger holds, if it holds a single integer
* // The result is undefined if this NestedInteger holds a nested list
* int getInteger() const;
*
* // Return the nested list that this NestedInteger holds, if it holds a nested list
* // The result is undefined if this NestedInteger holds a single integer
* const vector<NestedInteger> &getList() const;
* };
*/
class NestedIterator {
public:
NestedIterator(vector<NestedInteger> &nestedList):ls(nestedList) {
sz=ls.size();
pos=0;
}
int next() {
if(q.empty()){//此时pos上是整数
return ls[pos++].getInteger();
}
else{
int res=q.front();
q.pop();
if(q.empty()) ++pos;//q输出完毕,pos后移
return res;
}
}
bool hasNext() {
if(pos==sz) return false;
if(ls[pos].isInteger()){
return true;
}
if(q.empty()){//保存list内容
stack<vector<NestedInteger>> stV;//list
stack<int> stI;//索引
stV.push(ls[pos].getList());
stI.push(0);
while(!stV.empty()){
vector<NestedInteger> &vn=stV.top();
int &pos2=stI.top();
if(pos2==vn.size()){
stV.pop();
stI.pop();
continue;//本list读取结束
}
if(vn[pos2].isInteger()){
q.push(vn[pos2].getInteger());
++pos2;
}
else{
stV.push(vn[pos2].getList());
++pos2;
stI.push(0);
}
}
}
if(q.empty()){//空list
++pos;
return hasNext();
}
return true;
}
private:
vector<NestedInteger> ls;
queue<int> q;
size_t pos;//ls
size_t sz;
};
/**
* Your NestedIterator object will be instantiated and called as such:
* NestedIterator i(nestedList);
* while (i.hasNext()) cout << i.next();
*/