1. 程式人生 > >Leetcode 430.扁平化多級雙向連結串列

Leetcode 430.扁平化多級雙向連結串列

扁平化多級雙向連結串列

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

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

   

示例:

輸入:

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

   

以上示例的說明:

給出以下多級雙向連結串列:

   

我們應該返回如下所示的扁平雙向連結串列:

 

思路:這道題直接用棧就闊以搞定,分三種情況:

 

1:如果當前節點有孩子節點,把當前節點的下一個節點放入棧中,並且把當前節點的孩子節點指向當前節點的下一個節點

 

2:否則如果當前節點的下一個節點為空且棧不為空(已經處理完所有的帶孩子節點的節點,現在已經到了孩子節點的最後一個節點),那麼顯而易見的根據題意我們需要把孩子節點的最後一個節點指向當前節點。

 

3:每次都更新當前節點為下一個節點

 

 1 import java.util.Stack;
 2 
 3 // Definition for a Node.
 4 class Node {
 5     public int val;
 6     public Node prev;
 7     public Node next;
 8     public Node child;
 9 
10     public Node() {}
11 
12     public Node(int _val,Node _prev,Node _next,Node _child) {
13         val = _val;
14         prev = _prev;
15 next = _next; 16 child = _child; 17 } 18 }; 19 20 class Solution { 21 public Node flatten(Node head) { 22 if(head==null) return head; 23 Node p=head; 24 Stack<Node> s=new Stack<Node>(); 25 while(p!=null){ 26 if(p.child!=null){ 27 s.push(p.next); 28 p.next=p.child; 29 if(p.next!=null) p.next.prev=p; 30 p.child=null; 31 }else if(p.next==null&&!s.empty()){ 32 p.next=s.pop(); 33 if(p.next!=null) p.next.prev=p; 34 } 35 p=p.next; 36 } 37 return head; 38 } 39 }