ในปัญหานี้ เราได้รับรายการเชื่อมโยงหลายระดับ งานของเราคือการสร้างโปรแกรมเพื่อเรียบรายการเชื่อมโยงหลายระดับ
การดำเนินการแบนจะดำเนินการในลักษณะที่โหนดระดับแรกจะเกิดขึ้นก่อนในรายการที่เชื่อมโยง จากนั้นโหนดระดับที่สองจะเกิดขึ้น
รายการที่เชื่อมโยงหลายระดับ เป็นโครงสร้างข้อมูลแบบหลายมิติ ซึ่งทุกโหนดของรายการที่เชื่อมโยงมีตัวชี้ลิงก์สองตัว ตัวหนึ่งเป็นลิงก์ไปยังโหนดถัดไป และอีกตัวหนึ่งไปยังรายการย่อยที่มีโหนดอย่างน้อยหนึ่งโหนด ตัวชี้ลูกนี้อาจหรือไม่ชี้ไปที่โหนดรายการอื่น
ตัวอย่าง
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
ป้อนข้อมูล
ผลผลิต
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