欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

430. Flatten a Multilevel Doubly Linked List

程序员文章站 2022-03-07 18:05:36
...

 


You are given a doubly linked list which in addition to the next and previous pointers, it could have a child pointer, which may or may not point to a separate doubly linked list. These child lists may have one or more children of their own, and so on, to produce a multilevel data structure, as shown in the example below.

Flatten the list so that all the nodes appear in a single-level, doubly linked list. You are given the head of the first level of the list.

Example:

Input:
 1---2---3---4---5---6--NULL
         |
         7---8---9---10--NULL
             |
             11--12--NULL

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

Explanation for the above example:

Given the following multilevel doubly linked list:

430. Flatten a Multilevel Doubly Linked List

We should return the following flattened doubly linked list:

430. Flatten a Multilevel Doubly Linked List

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

    Node() {}

    Node(int _val, Node* _prev, Node* _next, Node* _child) {
        val = _val;
        prev = _prev;
        next = _next;
        child = _child;
    }
};
*/
class Solution {
public:
    Node* flatten(Node* head) {
        Node* ret = head;
        f(head);
        return ret;
    }
    Node* f(Node* head)
    {
        Node* curr = head;
        Node* save ;
        while(head)
        {
        save = head->next;
        if(head->child)
        {
        Node* temp = head->next;
        head->next = head->child;
        head->child->prev = head;
        head->child = NULL;
        temp = f(head->next);
        if(temp&&save)
        {
        temp->next = save;
        save->prev = temp;
        }
        }
            if(!save)
                break;
            head = save;
        }
       return head; 
    }
};