每日一道Leetcode - 430. 扁平化多級雙向連結串列

奮進的傑西發表於2020-11-19

在這裡插入圖片描述
參考了題解,理了下思路,本來還想著使用佇列和棧,其實沒有必要,因為他定義了三種不同型別的指標。
很巧妙的一個思路,遍歷節點,父節點的子孩子不為空,就將當前子連結串列的前節點指向父節點,遍歷子連結串列找到子連結串列的最後一個節點的後指標指向父節點本來的下一個節點。父節點的孩子節點也要設定為空,父節點本來的下一個節點也要設定prev指標指向前面的子連結串列找到的最後一個節點。

/*
// Definition for a Node.
class Node {
    public int val;
    public Node prev;
    public Node next;
    public Node child;
};
*/

class Solution {
    public Node flatten(Node head) {
        Node p = head;
        while(p!=null){
            if(p.child != null){
                // 孩子節點不為空
                // 記錄每個節點的兄弟連結串列 next 以及孩子連結串列 child
                Node next = p.next;
                Node child = p.child;
                // 將當前節點的兄弟指標指向孩子,並且孩子指標設定為空
                p.next = child;
                p.child = null;
                // 設定孩子節點的前指標為父節點p
                child.prev = p;
                // 遍歷孩子節點之後的連結串列,找到孩子連結串列節點的最後一個節點
                while(child.next!=null){
                    child = child.next;
                }
                // 孩子連結串列遇到null, 說明當前孩子連結串列節點的下一個指向父節點的兄弟連結串列
                child.next = next;
                // 因為next是卡斷的,所以判斷是否為空,不為空還要為他設定前指標指向當前孩子連結串列最後一個節點
                if(next!=null){
                    next.prev = child;
                }
            }
            // 孩子結點為空直接向後移
            // 上面的找到子連結串列操作之後也往後繼續遍歷找子連結串列處理
            p = p.next;
        }
        return head;
    }
}

相關文章