LeetCode #341 - Flatten Nested List Iterator

本文介绍了一种实现套叠链表迭代器的方法,通过使用栈来存储链表元素,确保能够正确地按顺序返回扁平化后的链表元素。关键在于hasNext函数的实现,它能确保每次调用都能确定是否存在下一个元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

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].

套叠链表的定义如下:
 * 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;
 * };
这道题的关键在hasNext函数,它需要每次遍历都能够确定是否还有下一个元素,由于采用栈存储套叠链表元素,所以如果发现栈顶元素不是数字,我们需要将这个套叠链表分解,也就是将链表中的所有元素反向压栈,接着再判断栈顶是否为数字,如果还不是,又接着将链表元素反向压栈,这样不断循环。

class NestedIterator {
public:
    NestedIterator(vector<NestedInteger> &nestedList) {
        for(int i=nestedList.size()-1;i>=0;i--)
            s.push(nestedList[i]);
    }

    int next() {
        int result=s.top().getInteger();
        s.pop();
        return result;
    }

    bool hasNext() {
        while(!s.empty())
        {
            NestedInteger x=s.top();
            if(x.isInteger()) return true;
            vector<NestedInteger> v=x.getList();
            s.pop();
            for(int i=v.size()-1;i>=0;i--) s.push(v[i]);
        }
        return false;
    }

private:
    stack<NestedInteger> s;
};

/**
 * Your NestedIterator object will be instantiated and called as such:
 * NestedIterator i(nestedList);
 * while (i.hasNext()) cout << i.next();
 */

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值