Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit aa7e650

Browse files
author
Tushar Roy
committed
update nested integer
1 parent 8f5dd0e commit aa7e650

File tree

1 file changed

+34
-54
lines changed

1 file changed

+34
-54
lines changed

‎src/com/interview/misc/NestedIterator.java‎

Lines changed: 34 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,12 @@
44
import java.util.Iterator;
55
import java.util.LinkedList;
66
import java.util.List;
7+
import java.util.Stack;
78

89
/**
10+
* Date 04/17/2017
11+
* @author Tushar Roy
12+
*
913
* Given a nested list of integers, implement an iterator to flatten it.
1014
* Each element is either an integer, or a list -- whose elements may also be integers or other lists.
1115
* Example 1:
@@ -15,74 +19,50 @@
1519
* https://leetcode.com/problems/flatten-nested-list-iterator/
1620
*/
1721
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;
2424
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());
2926
}
3027

3128
@Override
3229
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;
3436
}
3537

3638
@Override
3739
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+
}
4855
}
49-
} else {
50-
if (stack.isEmpty()) {
51-
return false;
56+
if (!pushedIntoStack) {
57+
stack.pop();
5258
}
53-
current = stack.pollFirst();
54-
position = positionStack.pollFirst();
55-
return hasNext();
5659
}
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() {
6960
return false;
7061
}
71-
72-
@Override
73-
public Integer getInteger() {
74-
return null;
75-
}
76-
77-
@Override
78-
public List<NestedInteger> getList() {
79-
return list;
80-
}
8162
}
8263

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();
8868
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /