dfs双端队列

难度中等

题目描述

给你一个嵌套的整型列表。请你设计一个迭代器,使其能够遍历这个整型列表中的所有整数。
列表中的每一项或者为一个整数,或者是另一个列表。其中列表的元素也可能是整数或是其他列表。

示例 1:
输入: [[1,1],2,[1,1]]
输出: [1,1,2,1,1]
解释: 通过重复调用 next 直到 hasNext 返回 false,next 返回的元素的顺序应该是: [1,1,2,1,1]。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/flatten-nested-list-iterator
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

DFS + 队列
由于存在嵌套,比较简单的做法是通过 DFS 进行处理,将元素都放至队列。

Code

  1. public interface NestedInteger {
  2. // @return true if this NestedInteger holds a single integer, rather than a nested list.
  3. public boolean isInteger();
  4. // @return the single integer that this NestedInteger holds, if it holds a single integer
  5. // Return null if this NestedInteger holds a nested list
  6. public Integer getInteger();
  7. // @return the nested list that this NestedInteger holds, if it holds a nested list
  8. // Return null if this NestedInteger holds a single integer
  9. public List<NestedInteger> getList();
  10. }
  11. /**
  12. * 341. 扁平化嵌套列表迭代器
  13. * 难度 中等
  14. */
  15. public class NestedIterator implements Iterator<Integer> {
  16. Deque<Integer> queue = new ArrayDeque<>();
  17. public NestedIterator(List<NestedInteger> nestedList) {
  18. dfs(nestedList);
  19. }
  20. @Override
  21. public Integer next() {
  22. return hasNext() ? queue.pollFirst() : -1;
  23. }
  24. @Override
  25. public boolean hasNext() {
  26. return !queue.isEmpty();
  27. }
  28. void dfs(List<NestedInteger> list) {
  29. for (NestedInteger item : list) {
  30. if (item.isInteger()) {
  31. queue.addLast(item.getInteger());
  32. } else {
  33. dfs(item.getList());
  34. }
  35. }
  36. }
  37. }