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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
 |  * // 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 { private:     stack< NestedInteger > lists; public:     NestedIterator(vector<NestedInteger> &nestedList) {         int size = nestedList.size();         for (int i = (size - 1); i >= 0; i--){             lists.push(nestedList[i]);         }     }     int next() {         NestedInteger cur = lists.top();         lists.pop();         return cur.getInteger();     }     bool hasNext() {                  while(!lists.empty()){             NestedInteger cur = lists.top();             if (!cur.isInteger()){                 lists.pop();                 vector<NestedInteger> tmplist = cur.getList();                 int len = tmplist.size();                 for (int i = (len - 1); i >= 0; i--){                                          lists.push(tmplist[i]);                 }             }             else{                 return true;             }         }         return false;     } };  * Your NestedIterator object will be instantiated and called as such:  * NestedIterator i(nestedList);  * while (i.hasNext()) cout << i.next();  */
 | 
参考资料: https://discuss.leetcode.com/topic/41846/concise-c-without-storing-all-values-at-initialization