题目地址:
https://www.lintcode.com/problem/flatten-2d-vector/description
给定若干个List,要求实现它的iterator,遍历顺序是按照每行从左到右,遍历完一行就继续遍历下一行的顺序。
思路是开两个iterator,分别是it
和it1
,一个遍历List of List,另一个遍历每行;先保证hasNext被调用的时候,it1
已经位于下一个要遍历到的数字的位置。具体方法是,当调用hasNext时,如果it1.hasNext()
本身就是true,那当然就直接返回true;否则的话,说明当前行遍历完了,那就移动it
到下一个非空的行,再令it1 = it.iterator()
,接着返回true,或者若不存在下一个非空的行,那就返回false。next和remove方法直接调用it1
的对应方法即可。代码如下:
import java.util.Iterator;
import java.util.List;
public class Vector2D implements Iterator<Integer> {
private Iterator<List<Integer>> it;
private Iterator<Integer> it1;
public Vector2D(List<List<Integer>> vec2d) {
// Initialize your data structure here
it = vec2d.iterator();
}
@Override
public Integer next() {
// Write your code here
return it1.next();
}
@Override
public boolean hasNext() {
// Write your code here
// 如果it1指在了一个非空行的某个数字上,那就返回true
if (it1 != null && it1.hasNext()) {
return true;
}
// 否则开始找下一个非空行
List<Integer> next = null;
while (it.hasNext()) {
next = it.next();
// 如果找到了非空行,就退出循环
if (!next.isEmpty()) {
break;
}
}
// 如果next仍然为null,或者next仍然是空的,说明没找到新的非空行,返回false
if (next == null || next.isEmpty()) {
return false;
}
// 否则说明找到了某个非空行,将it1设为这个非空行的iterator,返回true
it1 = next.iterator();
return true;
}
@Override
public void remove() {
it1.remove();
}
}
hasNext时间复杂度是 O ( l ) O(l) O(l), l l l指列表个数。其余操作时间复杂度 O ( 1 ) O(1) O(1)。空间复杂度 O ( 1 ) O(1) O(1)。