4
4
import java .util .Iterator ;
5
5
import java .util .LinkedList ;
6
6
import java .util .List ;
7
+ import java .util .Stack ;
7
8
8
9
/**
10
+ * Date 04/17/2017
11
+ * @author Tushar Roy
12
+ *
9
13
* Given a nested list of integers, implement an iterator to flatten it.
10
14
* Each element is either an integer, or a list -- whose elements may also be integers or other lists.
11
15
* Example 1:
15
19
* https://leetcode.com/problems/flatten-nested-list-iterator/
16
20
*/
17
21
public class NestedIterator implements Iterator <Integer > {
18
-
19
- private final Deque <NestedInteger > stack ;
20
- private NestedInteger current ;
21
- private final Deque <Integer > positionStack ;
22
- private int position = 0 ;
23
-
22
+ Stack <Iterator <NestedInteger >> stack = new Stack <>();
23
+ Integer nextVal = null ;
24
24
public NestedIterator (List <NestedInteger > nestedList ) {
25
- NestedInteger ni = new NestedIntegerImpl (nestedList );
26
- current = ni ;
27
- this .stack = new LinkedList <>();
28
- this .positionStack = new LinkedList <>();
25
+ stack .push (nestedList .iterator ());
29
26
}
30
27
31
28
@ Override
32
29
public Integer next () {
33
- return current .getList ().get (position ++).getInteger ();
30
+ if (!hasNext ()) {
31
+ throw new IllegalArgumentException ();
32
+ }
33
+ Integer val = nextVal ;
34
+ nextVal = null ;
35
+ return val ;
34
36
}
35
37
36
38
@ Override
37
39
public boolean hasNext () {
38
- if (position < current .getList ().size ()) {
39
- NestedInteger i = current .getList ().get (position );
40
- if (i .isInteger ()) {
41
- return true ;
42
- } else {
43
- stack .offerFirst (current );
44
- positionStack .offerFirst (position + 1 );
45
- current = i ;
46
- position = 0 ;
47
- return hasNext ();
40
+ if (nextVal != null ) {
41
+ return true ;
42
+ }
43
+ while (!stack .isEmpty ()) {
44
+ boolean pushedIntoStack = false ;
45
+ Iterator <NestedInteger > itr = stack .peek ();
46
+ if (itr .hasNext ()) {
47
+ NestedInteger ni = itr .next ();
48
+ if (ni .isInteger ()) {
49
+ nextVal = ni .getInteger ();
50
+ return true ;
51
+ } else {
52
+ pushedIntoStack = true ;
53
+ stack .push (ni .getList ().iterator ());
54
+ }
48
55
}
49
- } else {
50
- if (stack .isEmpty ()) {
51
- return false ;
56
+ if (!pushedIntoStack ) {
57
+ stack .pop ();
52
58
}
53
- current = stack .pollFirst ();
54
- position = positionStack .pollFirst ();
55
- return hasNext ();
56
59
}
57
- }
58
- }
59
-
60
- class NestedIntegerImpl extends NestedInteger {
61
-
62
- private List <NestedInteger > list ;
63
- NestedIntegerImpl (List <NestedInteger > list ) {
64
- this .list = list ;
65
- }
66
-
67
- @ Override
68
- public boolean isInteger () {
69
60
return false ;
70
61
}
71
-
72
- @ Override
73
- public Integer getInteger () {
74
- return null ;
75
- }
76
-
77
- @ Override
78
- public List <NestedInteger > getList () {
79
- return list ;
80
- }
81
62
}
82
63
83
-
84
- abstract class NestedInteger {
85
- abstract boolean isInteger ();
86
- abstract Integer getInteger ();
87
- abstract List <NestedInteger > getList ();
64
+ interface NestedInteger {
65
+ boolean isInteger ();
66
+ Integer getInteger ();
67
+ List <NestedInteger > getList ();
88
68
}
0 commit comments