341. Flatten Nested List Iterator

Medium (Google, Facebook, Twitter)

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

/**

  • // This is the interface that allows for creating nested lists.
  • // You should not implement it, or speculate about its implementation
  • public interface NestedInteger { *
  • // @return true if this NestedInteger holds a single integer, rather than a nested list.
  • public boolean isInteger(); *
  • // @return the single integer that this NestedInteger holds, if it holds a single integer
  • // Return null if this NestedInteger holds a nested list
  • public Integer getInteger(); *
  • // @return the nested list that this NestedInteger holds, if it holds a nested list
  • // Return null if this NestedInteger holds a single integer
  • public List getList();
  • } */

public class NestedIterator implements Iterator {

// test case:
// input is empty, but will call the function hasNext() or next()

private Stack<NestedInteger> stack = new Stack();
private NestedInteger current = null;

public NestedIterator(List<NestedInteger> nestedList) {
    if(nestedList == null || nestedList.size() == 0) {
        return ;
    }

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

@Override
public Integer next() {
    if(hasNext() == true) {
        return stack.pop().getInteger();
    } else {
        return -1;
    }
}

@Override
public boolean hasNext() {
    while(!stack.isEmpty()) {
        current = stack.peek();

        if(current.isInteger()) {
            return true;
        } else {
            stack.pop();
            List<NestedInteger> list = current.getList();

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

    return false;
}

}

results matching ""

    No results matching ""