leetcode:341. 压平嵌套链表迭代器

题目来源

  • leetcode:341. 压平嵌套链表迭代器

题目描述

给定一个嵌套的整数列表,实现一个迭代器来展平它。spa

每一个元素要么是一个整数,要么是一个列表——其元素也能够是整数或其余列表。code

例1:

给出列表[[1,1],2,[1,1]],

经过反复调用next,直到hasNext返回false,next返回的元素顺序应该是:[1,1,2,1,1]。

例2:

给出清单[1,[4,[6]]],

经过重复调用next直到hasNext返回false,next返回的元素顺序应该是:[1,4,6]。

题目解析

结构和leetcode:339 嵌套列表权重和是一样的,339题是用递归来解决的,而迭代器一般当使用迭代的方法来解决,将递归改写成迭代一般需要栈来辅助。

思路:

  • 初始化时,从后往前把对象压入栈中,这样第一个对象会最后一个压入栈,最先开始处理
  • next:如果栈不为空,那么取出栈顶元素,并弹出
  • hasNext:遍历栈并处理
    • 如果栈顶元素是整数,那么返回true
    • 如果栈顶元素不是整数,那么弹出栈顶元素,并将栈顶元素从后往前压入栈中
class NestedIterator  {
    std::stack<NestedInteger > stack;
public:
    NestedIterator(std::vector<NestedInteger > &nl){
        for (int i = nl.size() - 1; i >= 0; --i) {
            stack.push(nl[i]);
        }
    }
    
    int next(){
        NestedInteger t = stack.top(); stack.pop();
        return t.getInteger();
    }
    
    bool empty(){
        while (!stack.empty()){
            NestedInteger t = stack.top(); 
            if(t.isInteger()){
                return true;
            }
            stack.pop();
            for (int i = t.getList().size() - 1; i >= 0; ++i) {
                stack.push(t.getList()[i]);
            }
        }
        return false;
    }
};

我们也可以使用deque来代替stack

class NestedIterator  {
    std::deque<NestedInteger > stack;
public:
    NestedIterator(std::vector<NestedInteger > &nl){
        for (int i = nl.size() - 1; i >= 0; --i) {
            stack.push_back(nl[i]);
        }
    }
    
    int next(){
        NestedInteger t = stack.front(); stack.pop_front();
        return t.getInteger();
    }
    
    bool empty(){
        while (!stack.empty()){
            NestedInteger t = stack.front(); 
            if(t.isInteger()){
                return true;
            }
            stack.pop_front();
            for (int i = t.getList().size() - 1; i >= 0; ++i) {
                stack.push_back(t.getList()[i]);
            }
        }
        return false;
    }
};

如果我们就是要求用递归求解呢?我们可以使用一个队列,在构造的时候就利用迭代的方法把这个嵌套链表展开,然后hasNext()和next()就很简单了:

class NestedIterator  {
    std::queue<int> q;
    void make_queue(std::vector<NestedInteger> & nl){
        for(auto a : nl){
            if(a.isInteger()){
                q.push(a.getInteger());
            }else{
                auto tmp = a.getList();
                make_queue(tmp);
            }
        }
    }
public:
    NestedIterator(std::vector<NestedInteger > &nl){
        make_queue(nl);
    }
    
    int next(){
        auto t = q.front(); q.pop();
        return t;
    }
    
    bool empty(){
        return !q.empty();
    }
};

类似题目

  • leetcode:173. 二叉搜索树迭代器 Binary Search Tree Iterator
  • leetcode:339 嵌套列表权重和 Nested List Weight Sum
  • leetcode:341. 压平嵌套链表迭代器 Flatten Nested List Iterator
  • leetcode:251. 展开二维向量 Binary Search Tree Iterator
  • leetcode:284. 顶端迭代器 Peeking Iterator

你可能感兴趣的:(算法与数据结构,leetcode,算法)