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