隨筆-扁平化多級雙向連結串列
阿新 • • 發佈:2019-01-14
題目:您將獲得一個雙向連結串列,除了下一個和前一個指標之外,它還有一個子指標,可能指向單獨的雙向連結串列。這些子列表可能有一個或多個自己的子項,依此類推,生成多級資料結構,如下面的示例所示。
扁平化列表,使所有結點出現在單級雙鏈表中。您將獲得列表第一級的頭部。
示例:
輸入:
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; } }