Leetcode Java Flatten Nested List Iterator
업데이트:
문제
코드
/**
* // This is the interface that allows for creating nested lists.
* // You should not implement it, or speculate about its implementation
* public interface NestedInteger {
*
* // @return true if this NestedInteger holds a single integer, rather than a nested list.
* public boolean isInteger();
*
* // @return the single integer that this NestedInteger holds, if it holds a single integer
* // Return null if this NestedInteger holds a nested list
* public Integer getInteger();
*
* // @return the nested list that this NestedInteger holds, if it holds a nested list
* // Return empty list if this NestedInteger holds a single integer
* public List<NestedInteger> getList();
* }
*/
public class NestedIterator implements Iterator<Integer> {
private LinkedList<Iterator<NestedInteger>> linkedList;
private Iterator<NestedInteger> currentIterator;
private Integer next;
public NestedIterator(List<NestedInteger> nestedList) {
this.linkedList = new LinkedList<>();
this.currentIterator = nestedList.iterator();
this.next = this.getNext();
}
@Override
public Integer next() {
Integer temp = next;
this.next = this.getNext();
return temp;
}
@Override
public boolean hasNext() {
return this.next != null;
}
private Integer getNext() {
while (!this.currentIterator.hasNext()) {
if (this.linkedList.isEmpty()) {
return null;
}
this.currentIterator = this.linkedList.removeLast();
}
NestedInteger nextInteger = this.currentIterator.next();
if (nextInteger.isInteger()) {
return nextInteger.getInteger();
}
this.linkedList.addLast(this.currentIterator);
this.currentIterator = nextInteger.getList().iterator();
return this.getNext();
}
}
/**
* Your NestedIterator object will be instantiated and called as such:
* NestedIterator i = new NestedIterator(nestedList);
* while (i.hasNext()) v[f()] = i.next();
*/
결과
설명
- 중첩된 정수 List인 nestedList를 평면화 시키는 NestedIterator 클래스를 완성하는 문제이다.
- 생성자인 NestedIterator(List
nestedList)는 nestedList를 이용하여 NestedIterator를 초기화시킨다. - 메서드인 next()는 평면화된 nestedList의 다음 정수를 반환한다.
- 메서드인 hasNext()는 평면화된 nestedList의 다음 정수가 존재하는지 여부를 반환한다.
- 생성자인 NestedIterator(List
- 문제 풀이에 필요한 변수를 정의한다.
- linkedList는 nestedList를 이용하여 순차적인 정수 활용을 위한 LinkedList이다.
- currentIterator는 linkedList에서 순차적으로 Iterator를 받아와 사용하기 위한 Iterator이다.
- next는 다음 값을 임시 저장하기 위한 정수이다.
- 순차적으로 정수를 활용하기 위한 getNext() 메서드를 정의한다.
- currentIterator의 다음 값이 없을 때 까지 아래의 경우를 반복한다.
- linkedList가 비어있을 경우 더 이상 반환시킬 정수가 없으므로, null을 반환한다.
- 위의 경우가 아닌 경우, currentIterator에 linkedList의 마지막 Iterator를 꺼내 넣어준다.
- nextInteger에 currentInterator의 다음 차례 NestedInteger를 넣어준다.
- 만일 nextInteger가 Integer형인 경우, nextInteger의 Integer를 반환한다.
- 그렇지 않은 경우 아래를 수행한다.
- linkedList에 currentIterator를 마지막으로 넣어준다.
- currentIterator에 nextInteger의 List를 Iterator로 변환하여 넣어준다.
- 재귀 호출을 수행하여 다음 값을 탐색한다.
- currentIterator의 다음 값이 없을 때 까지 아래의 경우를 반복한다.
- 생성자인 NestedIterator(List
nestedList)를 완성한다. - linkedList에 새 LinkedList를 정의하여 넣어준다.
- currentIterator에 nestedList를 Iterator로 변환하여 넣어준다.
- next에 3번에서 정의한 getNext() 메서드를 호출한 결과를 넣어준다.
- 메서드인 next()를 완성한다.
- next의 값을 temp에 임시 보관하고, next에 3번에서 정의한 getNext()의 수행 결과를 넣어준다.
- 임시 저장한 다음 정수인 temp를 반환한다.
- 메서드인 hasNext()를 완성한다.
- 다음 정수를 저장한 next의 값이 null이면 다음 값이 존재하므로 true를, null이 아니면 다음 값이 존재하지 않으므로 false를 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기