扁平化多級雙向鏈表
一、LeetCode題解
瞧一瞧(求star!)
- LeetCode題解Javascript版本:Gitbook版本傳送門
- LeetCode題解Javascript版本:CSDN傳送門
- 前端進階筆記:Gitbook傳送門
二、算法題
題目
多級雙向鏈表中,除了指向下一個節點和前一個節點指針之外,它還有一個子鏈表指針,可能指向單獨的雙向鏈表。這些子列表也可能會有一個或多個自己的子項,依此類推,生成多級數據結構,如下面的示例所示。
給你位於列表第一級的頭節點,請你扁平化列表,使所有結點出現在單級雙鏈表中。
示例 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]
解釋:
這是鏈表的結構,向下爲child節點
1---2---3---4---5---6--NULL
|
7---8---9---10--NULL
|
11--12--NULL
解法一 (棧)
思路
- 一個節點同時擁有child和next節點時,我們叫他spec節點
- 保存spec節點的next節點。利用棧,壓入棧中
- 用child節點覆蓋next節點。
- 向下遍歷節點
- 最後在鏈表尾部以此鏈接棧頂的節點。
代碼
var flatten = function(head) {
var cur = head
var temp = [] // 存儲棧
while(cur && (cur.child || cur.next)) {
if(cur.child){
if(cur.next){ // 不保存尾節點
temp.push(cur.next)
}
cur.child.prev = cur // 維護prev節點
cur.next = cur.child // child節點頂替next節點
cur.child = null // 清空child節點(改變走向)
}
cur = cur.next // 向後一位
}
while(temp.length > 0){
let node = temp.pop()
node.prev = cur
cur.next = node
while(cur.next){ // 保證在尾節點鏈接
cur = cur.next
}
}
return head
};
結果
關於我
- decs: 19年畢業的前端開發一枚,沉迷Js
- E-mail: [email protected]
- 個人博客: CSDN
- GitHub: 傳送門