이 문제에서는 다단계 연결 목록이 제공됩니다. 우리의 임무는 다단계 연결 목록을 평면화하는 프로그램을 만드는 것입니다.
병합 작업은 연결 목록에서 첫 번째 수준 노드가 먼저 발생하고 두 번째 수준 노드가 발생하는 방식으로 수행됩니다.
다단계 연결 목록 링크드 리스트의 모든 노드가 두 개의 링크 포인터를 가지는 다차원 데이터 구조, 하나는 다음 노드에 대한 링크이고 다른 하나는 하나 이상의 노드가 있는 자식 리스트에 대한 링크입니다. 이 자식 포인터는 다른 목록 노드를 가리킬 수도 있고 가리지 않을 수도 있습니다.
예시

문제를 이해하기 위해 예를 들어보겠습니다.
입력

출력
1-> 9-> 8 -> 4 -> 6-> 7-> 2-> 3-> 5
솔루션 접근 방식
문제에 대한 간단한 해결책은 알고리즘의 레벨 순서 순회 유형을 사용하는 것입니다. 첫 번째 노드에서 시작하여 연결 목록을 순회하고 동일한 수준의 모든 노드를 순회합니다. 노드에 대한 자식 포인터가 있으면 꼬리 포인터를 사용하여 현재 연결 목록의 끝으로 이동합니다. 그런 다음 연결 목록의 각 자식 노드에 대해 동일한 순회를 재귀적으로 수행합니다. 아래 프로그램은 논리를 더 잘 설명할 것입니다.
예시
솔루션 작동을 설명하는 프로그램
#include <bits/stdc++.h>
using namespace std;
#define SIZE(arr) (sizeof(arr)/sizeof(arr[0]))
class Node{
public:
int data;
Node *next;
Node *child;
};
Node *createList(int *arr, int n){
Node *head = NULL;
Node *p;
int i;
for (i = 0; i < n; ++i){
if (head == NULL)
head = p = new Node();
else{
p->next = new Node();
p = p->next;
}
p->data = arr[i];
p->next = p->child = NULL;
}
return head;
}
Node *createList(void){
int arr1[] = {1, 9, 8, 4, 6};
int arr2[] = {7, 3, 2};
int arr3[] = {5};
Node *head1 = createList(arr1, (sizeof(arr1)/sizeof(arr1[0])));
Node *head2 = createList(arr2, (sizeof(arr2)/sizeof(arr2[0])));
Node *head3 = createList(arr3, (sizeof(arr3)/sizeof(arr3[0])));
head1->child = head2;
head1->next->child = head3;
return head1;
}
void flattenLinkedList(Node *head){
if (head == NULL)
return;
Node *tmp;
Node *tail = head;
while (tail->next != NULL)
tail = tail->next;
Node *cur = head;
while (cur != tail){
if (cur->child){
tail->next = cur->child;
tmp = cur->child;
while (tmp->next)
tmp = tmp->next;
tail = tmp;
}
cur = cur->next;
}
}
int main(void){
Node *head = NULL;
head = createList();
flattenLinkedList(head);
cout<<"The flattened Linked List is ";
while (head != NULL){
cout << head->data << " ";
head = head->next;
}
return 0;
} 출력
The flattened Linked List is 1 9 8 4 6 7 3 2 5