Leetcode Java Flatten a Multilevel Doubly Linked List
업데이트:
문제
코드
/*
// Definition for a Node.
class Node {
public int val;
public Node prev;
public Node next;
public Node child;
};
*/
class Solution {
public Node flatten(Node head) {
if (head == null) {
return null;
} else if (head.child == null) {
Node node = this.flatten(head.next);
head.next = node;
if (node != null) {
node.prev = head;
}
} else {
Node node = head.next;
Node child = this.flatten(head.child);
head.next = child;
child.prev = head;
Node temp = child;
while (temp.next != null) {
temp = temp.next;
}
Node next = this.flatten(node);
temp.next = next;
if (next != null) {
next.prev = temp;
}
head.child = null;
}
return head;
}
}
결과
설명
- 주어진 이전, 다음, 자식 노드 정보를 가지고 있는 head Node를 직렬화 시키는 문제이다.
- 직렬화 시킬 때, 자식 노드 -> 다음 노드 순의 순서로 진행한다.
-
head가 null인 경우 직렬화가 불가능하기 때문에, null을 반환한다.
- head의 child 노드가 null인 경우, 아래를 수행하여 다음 노드로 직렬화를 수행한다.
- node에 head의 next 노드를 이용하여 재귀 호출한 결과를 넣어준다.
- head의 next 노드에 node를 넣어준다.
- node가 null이 아닌 경우, node의 이전 값에 head를 넣어 이어준다.
- 그 외의 head의 child 노드가 존재하는 경우, 아래를 수행하여 순차적으로 직렬화를 수행한다.
- node에 head의 next 노드를 임시로 넣어준다.
- child에 head의 child 노드를 이용하여 재귀 호출한 결과를 넣어준다.
- child -> next 순으로 직렬화 하기 때문에, child를 먼저 직렬화 한다.
- head의 next에 child 노드를, child의 prev 노드에 head를 넣어 각 노드를 이어준다.
- temp에 child를 넣어주고, temp의 next 노드가 null이 아닐 때 까지 반복하여 temp에 temp의 next 노드를 넣어 마지막 노드로 이동시킨다.
- next에 node의 재귀 호출을 수행한 결과를 넣어준다.
- temp의 next 노드에 next를 넣어준다.
- next가 null이 아닌 경우, next의 prev 노드에 temp를 넣어 위의 child를 직렬화 한 노드에 이어준다.
- head의 child 노드에 null을 넣어 자식 노드를 제거한다.
- 수행이 완료되면 부분 직렬화를 수행한 head를 반환하고, 최종 직렬화가 완료되면 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기