1. 程式人生 > >隨筆-扁平化多級雙向連結串列

隨筆-扁平化多級雙向連結串列

題目:您將獲得一個雙向連結串列,除了下一個和前一個指標之外,它還有一個子指標,可能指向單獨的雙向連結串列。這些子列表可能有一個或多個自己的子項,依此類推,生成多級資料結構,如下面的示例所示。

扁平化列表,使所有結點出現在單級雙鏈表中。您將獲得列表第一級的頭部。

示例:

輸入:
1—2---3—4---5—6–NULL
|
7—8---9—10–NULL
|
11–12–NULL

輸出:
1-2-3-7-8-11-12-9-10-4-5-6-NULL

思路:我們只看兩級連結串列,其實本質就是遇見child 將child這條連結串列插入cur 和 cur.next之間 ,只不過需要注意的是連結串列有前驅;每次節點變化都需要重新設定前驅;再有一點需要注意的就是cur.next為空的邊界條件,這個就需要判斷一下。

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

    public Node() {}

    public Node(int _val,Node _prev,Node _next,Node _child) {
        val = _val;
        prev = _prev;
        next = _next;
        child = _child;
    }
};
*/
class Solution {
    public Node flatten(Node head) {
        if(head==null || head.next==null&&head.child==null){
            return head;
        }
        Node cur=head;
        Node pre;
        Node cur1;
        Node child;
        while(cur!=null){
            if(cur.child!=null){
                child=cur.child; //孩子鏈頭
                pre=cur.next; //主鏈的下一節點
                cur.next=child; //主鏈的下一節點為孩子
                child.prev=cur; //新的下一節點的前驅繫結主鏈前一節點
                cur.child=null; //已經拼接到主鏈,孩子鏈置為空;
                if(pre==null){
                    continue;
                }
                while(child.next!=null){//找到新主鏈的下一節點
                    child=child.next;
                }
                child.next=pre;//連線以前的主鏈
                   pre.prev=child; 
            }
            cur=cur.next;
        }
        return head;
    }
}