LeetCode430 扁平化多級雙向連結串列
阿新 • • 發佈:2018-12-03
您將獲得一個雙向連結串列,除了下一個和前一個指標之外,它還有一個子指標,可能指向單獨的雙向連結串列。這些子列表可能有一個或多個自己的子項,依此類推,生成多級資料結構,如下面的示例所示。
扁平化列表,使所有結點出現在單級雙鏈表中。您將獲得列表第一級的頭部。
示例:
輸入: 1---2---3---4---5---6--NULL | 7---8---9---10--NULL | 11--12--NULL 輸出: 1-2-3-7-8-11-12-9-10-4-5-6-NULL
以上示例的說明:
給出以下多級雙向連結串列:
我們應該返回如下所示的扁平雙向連結串列:
//章節 - 連結串列 //四、小結 //3.扁平化多級雙向連結串列 /* 演算法思想: 題意較複雜,先讀懂題意,可以看出如果某個結點有下一層雙向連結串列,那麼下一層雙向連結串列中的結點就要先加入進去,如果下一層連結串列中某個結點還有下一層,那麼還是優先加入下一層的結點,整個加入的機制是DFS的,就是有岔路先走岔路,走到沒路了後再返回,這就是深度優先遍歷的機制。 採用迭代,迭代的寫法與遞迴是反過來的,先把第二層加入第一層,此時第二層底下可能還有很多層,不必理會,之後等遍歷到的時候,再一層一層的加入第一層中,最終都可以壓平。*/ //演算法實現: /* // Definition for a Node. class Node { public: int val = NULL; Node* prev = NULL; Node* next = NULL; Node* child = NULL; Node() {} Node(int _val, Node* _prev, Node* _next, Node* _child) { val = _val; prev = _prev; next = _next; child = _child; } };*/ class Solution { public: Node* flatten(Node* head) { Node *cur = head; while (cur) { if (cur->child) { //如果有孩子,既有下一層 Node *next = cur->next; //儲存斷開點 Node *last = cur->child; //進入下一層 while (last->next) last = last->next; cur->next = cur->child; cur->next->prev = cur; cur->child = NULL; last->next = next; if (next) next->prev = last; } cur = cur->next; } return head; } };