Iterator 类
所谓的 Zigzag 其实等价于 circular ~ 实现 circular 的常见办法有两个:
建 array / arraylist,靠取 mod 的 index trick;
直接用内置的 deque 库,每次头尾操作就可以
public class ZigzagIterator {
Deque<Iterator<Integer>> deque;
public ZigzagIterator(List<Integer> v1, List<Integer> v2) {
deque = new LinkedList<Iterator<Integer>>();
if(v1.size() != 0) deque.offerFirst(v1.iterator());
if(v2.size() != 0) deque.offerFirst(v2.iterator());
}
public int next() {
Iterator<Integer> iter = deque.pollLast();
int num = iter.next();
if(iter.hasNext()) deque.offerFirst(iter);
return num;
}
public boolean hasNext() {
return (deque.size() != 0);
}
}由于先做了 Flatten Nested List Iterator 的 peeking iterator 实现,做这题简直毫无压力。。。
依然是没啥难度。。迭代器好简单。。
之前准备 LinkedIn 的时候做过,拿来重用下。
首先我不太认同 LC 的 test case 里没有重复的 hasNext() 调用的情况。。把执行逻辑全堆到 hasNext() 里是有问题的。
关键在于 internalNext() 的实现,还有巧妙递归调用自己减少代码量的实现方式。
如果 cur Iterator 还有货,就遍历;
遍历出来的是 Integer,就可以直接设 instance variable 了;
遍历出来的是 List,说明下面还有子树,先把当前的存 Stack 上,cur 指到下面,再调用自己一次;
cur 没货了,从 stack 里取一个,接着搞;
stack 也没货了,就只能返回 null 了 ...
顺着这个思路设计的话,BST iterator 也可以做。不过因为 TreeNode 不自带 iterator,往右子树跳的那一下,得自己手动写。
这题的另一种画风比较常规的写法就是 in-order traversal ~
(FB) Binary Tree Post-order iterator
据群内小伙伴表示是 FB 高频提题,自己就写 test case 试试看。
其实这题就是考你到底会不会写只依靠 stack + cur + prev 指针的迭代写法,如果会了,这题就做出来了。
Last updated
Was this helpful?