430. 扁平化多級雙向連結串列
題目:具體圖解可在leetcode檢視
多級雙向連結串列中,除了指向下一個節點和前一個節點指標之外,它還有一個子連結串列指標,可能指向單獨的雙向連結串列。這些子列表也可能會有一個或多個自己的子項,依此類推,生成多級資料結構,如下面的示例所示。
給你位於列表第一級的頭節點,請你扁平化列表,使所有結點出現在單級雙連結串列中。
思路:深度遍歷多級連結串列並用一個陣列記錄遍歷節點,同時用一個輔助陣列記錄當前節點的遍歷狀態,為0說明反向遍歷找下一個節點時忽略,為1則說明下一次遍歷從該處開始。這樣每次深度遍歷到空指標時就回溯陣列,直到某次回溯找不到下一次遍歷開始的指標,說明所有節點都進入陣列,此時修改陣列內節點指標即可。
程式碼:
/*
// Definition for a Node.
class Node {
public:
int val;
Node* prev;
Node* next;
Node* child;
};
*/
class Solution {
public:
Node* flatten(Node* head) {
vector<Node *> rs;
vector<int> sign;
Node *nh = head;
if(nh == NULL)
return NULL;
//建立一個棧,按深度遍歷原多級連結串列
while(1){
int flag = 1;
if(nh->child){
flag = 0;
rs.push_back(nh);
sign.push_back(1);
nh = nh->child;
}
else{
if(nh->next){
flag = 0;
rs.push_back(nh);
sign.push_back(0);
nh = nh->next;
}
else{
rs.push_back(nh);
sign.push_back(0);
for(int i = rs.size()-1;i>=0;i--){
if(rs[i]->next && sign[i]){
flag = 0;
nh = rs[i]->next;
sign[i] = 0;
break;
}
}
}
}
if(flag)
break;
}
/*每個節點都新建,解決無效雙連結串列報錯
Node *nhead = new Node;
nhead->next = NULL;
nhead->prev = NULL;
nhead->child = NULL;
Node *t = nhead;
//重新續接連結串列
for(int i = 0;i<rs.size();i++){
Node *temp = new Node;
temp->val = rs[i]->val;
temp->prev = t;
t->next = temp;
temp->next = NULL;
temp->child = NULL;
t = t->next;
}
nhead = nhead->next;
nhead->prev = NULL;
*/
//原出現無效雙連結串列報錯是因為頭節點處有無效指標,現直接改變棧裡指標也可
for(int i = 0;i<rs.size()-1;i++){
rs[i]->next = rs[i+1];
rs[i+1]->prev = rs[i];
rs[i]->child = NULL;
}
rs[rs.size()-1]->child = NULL;
rs[rs.size()-1]->next = NULL;
return rs[0];
}
};
提交:
相關文章
- 每日一道Leetcode - 430. 扁平化多級雙向連結串列LeetCode
- 連結串列-雙向連結串列
- 連結串列-雙向通用連結串列
- 雙向連結串列
- 連結串列-雙向非通用連結串列
- 資料結構--陣列、單向連結串列、雙向連結串列資料結構陣列
- 實現雙向連結串列
- 資料結構——雙向連結串列資料結構
- 結構與演算法(03):單向連結串列和雙向連結串列演算法
- Go實現雙向連結串列Go
- java實現雙向連結串列Java
- DoublyLinkedList(雙向連結串列)——Javascript版JavaScript
- 資料結構實驗之連結串列九:雙向連結串列資料結構
- 資料結構之雙向連結串列資料結構
- 【c# .net】雙向連結串列( LinkedList )C#
- 雙向連結串列 尾節點插入
- 資料結構與演算法——連結串列 Linked List(單連結串列、雙向連結串列、單向環形連結串列-Josephu 問題)資料結構演算法
- 連結串列 - 單向連結串列
- 畫江湖之資料結構【第一話:連結串列】雙向連結串列資料結構
- 畫江湖之資料結構 [第一話:連結串列] 雙向連結串列資料結構
- 雙向連結串列的功能實現(初版
- LVGL雙向連結串列學習筆記筆記
- 資料結構(雙向連結串列的實現)資料結構
- 雙向連結串列————查詢、刪除、插入結點
- 資料結構-雙向連結串列(Python實現)資料結構Python
- 雙向連結串列介面設計(C語言)C語言
- 資料結構-單連結串列、雙連結串列資料結構
- 單雙連結串列
- 雙向迴圈連結串列的介面設計(初版
- 請使用 js 實現一個雙向連結串列JS
- Redis 原始碼解析之通用雙向連結串列(adlist)Redis原始碼
- 雙向迴圈連結串列————遍歷、查詢、插入結點
- 【資料結構與演算法學習】線性表(順序表、單連結串列、雙向連結串列、迴圈連結串列)資料結構演算法
- 棧_單向連結串列
- 12.19單向連結串列
- 自定義雙向迴圈連結串列基本函式介面函式
- 詳解雙向連結串列的基本操作(C語言)C語言
- python演算法與資料結構-雙向連結串列(40)Python演算法資料結構