LeetCode題解:430.扁平化多級雙向鏈表

扁平化多級雙向鏈表

一、LeetCode題解

瞧一瞧(求star!)

二、算法題

題目

多級雙向鏈表中,除了指向下一個節點和前一個節點指針之外,它還有一個子鏈表指針,可能指向單獨的雙向鏈表。這些子列表也可能會有一個或多個自己的子項,依此類推,生成多級數據結構,如下面的示例所示。

給你位於列表第一級的頭節點,請你扁平化列表,使所有結點出現在單級雙鏈表中。

示例 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
};

結果

在這裏插入圖片描述

關於我

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章