題目:
多級雙向鍊錶中,除了指向下乙個節點和前乙個節點指標之外,它還有乙個子鍊錶指標,可能指向單獨的雙向鍊錶。
這些子列表也可能會有乙個或多個自己的子項,依此類推,生成多級資料結構,如下面的示例所示。
給你位於列表第一級的頭節點,請你扁平化列表,使所有結點出現在單級雙鏈表中。
示例 1:
輸入:head =[1
,2,3
,4,5
,6,null,null,null,7,
8,9,
10,null,null,11,
12]輸出:[1,
2,3,
7,8,
11,12,
9,10,
4,5,
6]解釋:輸入的多級列表如下圖所示:
扁平化後的鍊錶如下圖:
示例 2:
輸入:head =[1
,2,null,3]
輸出:[1,
3,2]
解釋:輸入的多級列表如下圖所示:
1---2
---null|3
---null
示例 3:
輸入:head =
輸出:
如何表示測試用例中的多級鍊錶?
以 示例 1 為例:
1---2
---3--
-4---
5---6
--null|7
---8--
-9---
10--
null|11
--12
--null
序列化其中的每一級之後:[1
,2,3
,4,5
,6,null][7
,8,9
,10,null][11
,12,null]
為了將每一級都序列化到一起,我們需要每一級中新增值為 null 的元素,以表示沒有節點連線到上一級的上級節點。[1
,2,3
,4,5
,6,null]
[null,null,7,
8,9,
10,null]
[null,11,
12,null]
合併所有序列化結果,並去除末尾的 null 。[1
,2,3
,4,5
,6,null,null,null,7,
8,9,
10,null,null,11,
12]節點數目不超過 1000
1<= node.val <=10^
5
思路:首先,這道題是乙個典型的dfs型別的題目,利用深度優先便利的思想可以完成對於結點訪問的正確順序;
需要注意的一點,在遞迴的過程中,dfs返回後的指標是當前函式棧內的值,因此dfs中第二個引數用來連線鍊錶的指標需要定義為在函式內部可以修改值的引數,也就是引用型別;對dfs的邏輯進行梳理:
返回條件:child == null && next == null
如果有child結點,則dfs(p->child,q);表示進入child鏈深度訪問
else如果無child 或 從child子鏈返回,則繼續訪問當前的next結點
**如下
**:ac
/*
// definition for a node.
class node ;
*/class solution
if(next)
dfs(next,pre)
;//再進行next的dfs;
return;}
node*
flatten
(node* head)
};
扁平化多級雙向鍊錶
題目描述 多級雙向鍊錶中,除了指向下乙個節點和前乙個節點指標之外,它還有乙個子鍊錶指標,可能指向單獨的雙向鍊錶。這些子列表也可能會有乙個或多個自己的子項,依此類推,生成多級資料結構,如下面的示例所示。給你位於列表第一級的頭節點,請你扁平化列表,使所有結點出現在單級雙鏈表中。示例 1 輸入 head ...
扁平化多級雙向鍊錶
您將獲得乙個雙向鍊錶,除了下乙個和前乙個指標之外,它還有乙個子指標,可能指向單獨的雙向鍊錶。這些子列表可能有乙個或多個自己的子項,依此類推,生成多級資料結構,如下面的示例所示。扁平化列表,使所有結點出現在單級雙鏈表中。您將獲得列表第一級的頭部。示例 輸入 1 2 3 4 5 6 null 7 8 9...
430 扁平化多級雙向鍊錶
題目 多級雙向鍊錶中,除了指向下乙個節點和前乙個節點指標之外,它還有乙個子鍊錶指標,可能指向單獨的雙向鍊錶。這些子列表也可能會有乙個或多個自己的子項,依此類推,生成多級資料結構,如下面的示例所示。給你位於列表第一級的頭節點,請你扁平化列表,使所有結點出現在單級雙鏈表中。示例 1 輸入 head 1,...