Flatten Nested List Iterator
MediumStackTreeDepth-First SearchDesignQueueIterator
Solution
export class NestedInteger {
private value: number | NestedInteger[];
constructor(value?: number) {
this.value = value ?? [];
}
isInteger(): boolean {
return !Array.isArray(this.value);
}
getInteger(): number | null {
return !Array.isArray(this.value) ? this.value : null;
}
setInteger(value: number) {
this.value = value;
}
add(elem: NestedInteger) {
if (Array.isArray(this.value)) {
this.value.push(elem);
} else {
this.value = [elem];
}
}
getList(): NestedInteger[] {
return Array.isArray(this.value) ? this.value : [];
}
}
export class NestedIterator {
private stack: NestedInteger[];
constructor(nestedList: NestedInteger[]) {
this.stack = nestedList.reverse();
}
hasNext(): boolean {
while (0 < this.stack.length) {
const top = this.stack[this.stack.length - 1];
if (top.isInteger()) {
return true;
}
this.stack.pop();
this.stack.push(...top.getList().reverse());
}
return false;
}
next(): number {
const top = this.stack.pop()!;
return top.getInteger()!;
}
}