package com.interview.misc; import java.util.Deque; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Stack; /** * Date 04/17/2017 * @author Tushar Roy * * 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]. * * https://leetcode.com/problems/flatten-nested-list-iterator/ */ public class NestedIterator implements Iterator<Integer> { Stack<Iterator<NestedInteger>> stack = new Stack<>(); Integer nextVal = null; public NestedIterator(List<NestedInteger> nestedList) { stack.push(nestedList.iterator()); } @Override public Integer next() { if (!hasNext()) { throw new IllegalArgumentException(); } Integer val = nextVal; nextVal = null; return val; } @Override public boolean hasNext() { if (nextVal != null) { return true; } while (!stack.isEmpty()) { boolean pushedIntoStack = false; Iterator<NestedInteger> itr = stack.peek(); if (itr.hasNext()) { NestedInteger ni = itr.next(); if (ni.isInteger()) { nextVal = ni.getInteger(); return true; } else { pushedIntoStack = true; stack.push(ni.getList().iterator()); } } if (!pushedIntoStack) { stack.pop(); } } return false; } } interface NestedInteger { boolean isInteger(); Integer getInteger(); List<NestedInteger> getList(); }