[Medium] 341. Flatten Nested List Iterator

문제

You are given a nested list of integers nestedList. Each element is either an integer or a list whose elements may also be integers or other lists. Implement an iterator to flatten it.

Implement the NestedIterator class:

  • NestedIterator(List<NestedInteger> nestedList) Initializes the iterator with the nested list nestedList.
  • int next() Returns the next integer in the nested list.
  • boolean hasNext() Returns true if there are still some integers in the nested list and false otherwise.

Your code will be tested with the following pseudocode:

initialize iterator with nestedList
res = []
while iterator.hasNext()
    append iterator.next() to the end of res
return res

If res matches the expected flattened list, then your code will be judged as correct.

 

정수 nestedList의 중첩 목록이 제공됩니다. 각 요소는 정수이거나 정수이거나 다른 목록일 수 있는 목록입니다. 

반복문을 구현하여 평평하게 만듭니다.

중첩 구현 반복문 클래스:

중첩된 반복자(목록<내포)정수 > 중첩된 목록) 중첩된 목록으로 반복기를 초기화합니다.
int next() 중첩된 목록의 다음 정수를 반환합니다.
boolean hasNext() 중첩된 목록에 여전히 정수가 있으면 true를 반환하고 그렇지 않으면 false를 반환합니다.
코드는 다음 유사 코드로 테스트됩니다.

initialize iterator with nestedList
res = []
while iterator.hasNext()
    append iterator.next() to the end of res
return res

res가 예상 플랫 목록과 일치하면 코드가 올바른 것으로 판단됩니다.

 

예시

Example 1:

Input: nestedList = [[1,1],2,[1,1]]
Output: [1,1,2,1,1]
Explanation: By calling next repeatedly until hasNext returns false, the order of elements returned by next should be: [1,1,2,1,1].

Example 2:

Input: nestedList = [1,[4,[6]]]
Output: [1,4,6]
Explanation: By calling next repeatedly until hasNext returns false, the order of elements returned by next should be: [1,4,6].

 

제약 조건

Constraints:

  • 1 <= nestedList.length <= 500
  • The values of the integers in the nested list is in the range [-106, 106].

 

해결 코드

/**
 * // This is the interface that allows for creating nested lists.
 * // You should not implement it, or speculate about its implementation
 * function NestedInteger() {
 *
 *     Return true if this NestedInteger holds a single integer, rather than a nested list.
 *     @return {boolean}
 *     this.isInteger = function() {
 *         ...
 *     };
 *
 *     Return the single integer that this NestedInteger holds, if it holds a single integer
 *     Return null if this NestedInteger holds a nested list
 *     @return {integer}
 *     this.getInteger = function() {
 *         ...
 *     };
 *
 *     Return the nested list that this NestedInteger holds, if it holds a nested list
 *     Return null if this NestedInteger holds a single integer
 *     @return {NestedInteger[]}
 *     this.getList = function() {
 *         ...
 *     };
 * };
 */
/**
 * @constructor
 * @param {NestedInteger[]} nestedList
 */
class NestedIterator {
    constructor(nestedList) {
        this.data = []
        this.flatten(nestedList)
    };
    
    flatten(list) {
        for (let el of list)
            if (el.isInteger()) this.data.push(el.getInteger())
            else this.flatten(el.getList())
    };
    
    hasNext() { return this.data.length };
    
    next() { return this.data.shift() };
};