第一种方法是按序遍历,然后放在一个数组里面,然后再一个个输出,虽然有点投机取巧,但是是很不错的方法。自己写的代码结构能够按照这样的方法完成任务,具体就不贴了。主要是第二种方法,利用栈的方式。建立一个栈,其中存放的是指向不同列表中某一元素的指针。在遍历的过程中,如果遇到列表,就将列表的头结点压栈,并且将指向这个列表中元素的指针向后移一位,进入下一轮循环。如果遇到数,就跳出循环,去getInteger函数中读取当前数,也就是栈顶元素所对应的值,并将栈顶存放的指针向后移动一位。在下一次循环中将栈顶元素赋给遍历所用指针,如果循环时当前指针指向了该指针所在列表的末尾,就需要回到该列表所属的列表中去继续遍历,也就是弹出当前栈顶元素。完成弹出之后,栈顶元素则指向刚刚那个完成遍历的列表所属的那个列表中的元素。贴代码

leetcode 341 扁平化嵌套列表迭代器_压栈leetcode 341 扁平化嵌套列表迭代器_代码结构_02
 1 /**
 2  * // This is the interface that allows for creating nested lists.
 3  * // You should not implement it, or speculate about its implementation
 4  * class NestedInteger {
 5  *   public:
 6  *     // Return true if this NestedInteger holds a single integer, rather than a nested list.
 7  *     bool isInteger() const;
 8  *
 9  *     // Return the single integer that this NestedInteger holds, if it holds a single integer
10  *     // The result is undefined if this NestedInteger holds a nested list
11  *     int getInteger() const;
12  *
13  *     // Return the nested list that this NestedInteger holds, if it holds a nested list
14  *     // The result is undefined if this NestedInteger holds a single integer
15  *     const vector<NestedInteger> &getList() const;
16  * };
17  */
18 
19 class NestedIterator {
20 private:
21     //按顺序把遍历到的列表的指针压入栈中,根据栈的性质进行遍历
22     stack<pair<vector<NestedInteger>::iterator,vector<NestedInteger>::iterator>> st;
23 public:
24     NestedIterator(vector<NestedInteger> &nestedList) 
25     {
26         st.emplace(nestedList.begin(),nestedList.end());    
27     }    
28     int next() 
29     {
30         return st.top().first++->getInteger();        
31     }    
32     bool hasNext() 
33     {
34         while(!st.empty())
35         {
36             auto &temp = st.top();
37             //遍历到当前指针指向的列表的末尾
38             if(temp.first == temp.second)
39             {
40                 st.pop();
41                 continue;
42             }
43             if(temp.first->isInteger())
44             {
45                 return true;
46             }
47             //这里的++是为了下次回到这个列表中时指针在正确的位置上
48             auto &nest = temp.first++->getList();
49             st.emplace(nest.begin(),nest.end()); 
50         }
51         return false;        
52     }
53 };
54 
55 /**
56  * Your NestedIterator object will be instantiated and called as such:
57  * NestedIterator i(nestedList);
58  * while (i.hasNext()) cout << i.next();
59  */
View Code