341. 扁平化嵌套列表迭代器

import java.util.Iterator;
import java.util.List;
import java.util.Stack;

class NestedIterator implements Iterator<Integer> {

    Stack<NestedInteger> stack = new Stack<>();

    public NestedIterator(List<NestedInteger> nestedList) {

        /**
         * 将原嵌套列表倒序压入栈,这样就可以正序取出来
         */
        for (int i = nestedList.size() - 1; i >= 0; i--) {
            stack.push(nestedList.get(i));
        }
    }

    /**
     * 如果栈中还有元素的话,是整数就直接取出,是嵌套列表就在hasNext()方法中将其解压
     */
    @Override
    public Integer next() {
        return hasNext() ? stack.pop().getInteger() : -1;
    }

    @Override
    public boolean hasNext() {

        if (stack.isEmpty()){
            return false;
        }

        if (stack.peek().isInteger()){
            return true;
        }
        else {

            /**
             * 如果下一个元素是嵌套列表,就和前面一样将其倒序压入栈中
             */
            List<NestedInteger> tempList = stack.pop().getList();

            for (int i = tempList.size() - 1; i >= 0; i--) {
                stack.push(tempList.get(i));
            }

            /**
             * 将嵌套列表解压后,不能直接返回true,因此可能解压后栈就空了,所以需要递归的检查
             * 先调用的hasNext(),然后才是next(),如果传入列表是[[]],那么在hasNext()步骤就是false了,结果会是[]而不是[-1]
             */
            return hasNext();
        }
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(n)
 */

https://leetcode-cn.com/problems/flatten-nested-list-iterator/

posted @ 2021-12-21 16:44  振袖秋枫问红叶  阅读(38)  评论(0)    收藏  举报