题目:
用一个栈来维护深度优先搜索时,从根节点到当前节点路径上的所有节点。由于非叶节点对应的是一个列表,我们在栈中存储的是指向列表当前遍历的元素的指针(下标)。每次向下搜索时,取出列表的当前指针指向的元素并将其入栈,同时将该指针向后移动一位。如此反复直到找到一个整数。循环时若栈顶指针指向了列表末尾,则将其从栈顶弹出。
下面的代码中,栈存储的是迭代器,迭代器可以起到指向元素的指针的效果,通过将元素弹出队首的操作代替移动指针的操作。
public class NestedIterator implements Iterator<Integer> {
// 存储列表的当前遍历位置
private Deque<Iterator<NestedInteger>> stack;
public NestedIterator(List<NestedInteger> nestedList) {
stack = new LinkedList<Iterator<NestedInteger>>();
stack.push(nestedList.iterator());
}
@Override
public Integer next() {
// 由于保证调用 next 之前会调用 hasNext,直接返回栈顶列表的当前元素
return stack.peek().next().getInteger();
}
@Override
public boolean hasNext() {
while (!stack.isEmpty()) {
Iterator<NestedInteger> it = stack.peek();
if (!it.hasNext()) { // 遍历到当前列表末尾,出栈
stack.pop();
continue;
}
// 若取出的元素是整数,则通过创建一个额外的列表将其重新放入栈中
NestedInteger nest = it.next();
if (nest.isInteger()) {
List<NestedInteger> list = new ArrayList<NestedInteger>();
list.add(nest);
stack.push(list.iterator());
return true;
}
stack.push(nest.getList().iterator());
}
return false;
}
}