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

wyzworld發表於2020-12-25

題目:具體圖解可在leetcode檢視

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

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

 

思路:深度遍歷多級連結串列並用一個陣列記錄遍歷節點,同時用一個輔助陣列記錄當前節點的遍歷狀態,為0說明反向遍歷找下一個節點時忽略,為1則說明下一次遍歷從該處開始。這樣每次深度遍歷到空指標時就回溯陣列,直到某次回溯找不到下一次遍歷開始的指標,說明所有節點都進入陣列,此時修改陣列內節點指標即可。

程式碼:

/*

// Definition for a Node.

class Node {

public:

    int val;

    Node* prev;

    Node* next;

    Node* child;

};

*/



class Solution {

public:

    Node* flatten(Node* head) {

        vector<Node *> rs;

        vector<int> sign;



        Node *nh = head;

        if(nh == NULL)

        return NULL;



        //建立一個棧,按深度遍歷原多級連結串列

        while(1){

            int flag = 1;

            if(nh->child){

                flag = 0;

                rs.push_back(nh);

                sign.push_back(1);

                nh = nh->child;

            }

            else{

                if(nh->next){

                    flag = 0;

                    rs.push_back(nh);

                    sign.push_back(0);

                    nh = nh->next;

                }

                else{

                    rs.push_back(nh);

                    sign.push_back(0);

                    for(int i = rs.size()-1;i>=0;i--){

                        if(rs[i]->next && sign[i]){

                            flag = 0;

                            nh = rs[i]->next;

                            sign[i] = 0;

                            break;

                        }

                    }

                }

            }

            if(flag)

                break;

        }



        /*每個節點都新建,解決無效雙連結串列報錯

        Node *nhead = new Node;

        nhead->next = NULL;

        nhead->prev = NULL;

        nhead->child = NULL;

        Node *t = nhead;



        //重新續接連結串列

        for(int i = 0;i<rs.size();i++){

            Node *temp = new Node;

            temp->val = rs[i]->val;

            temp->prev = t;

            t->next = temp;

            temp->next = NULL;

            temp->child = NULL;

            t = t->next;

        }

        nhead = nhead->next;

        nhead->prev = NULL;

        */



        //原出現無效雙連結串列報錯是因為頭節點處有無效指標,現直接改變棧裡指標也可

        for(int i = 0;i<rs.size()-1;i++){

            rs[i]->next = rs[i+1];

            rs[i+1]->prev = rs[i];

            rs[i]->child = NULL;

        }

        rs[rs.size()-1]->child = NULL;

        rs[rs.size()-1]->next = NULL;



        return rs[0];

    }

};

提交:

相關文章