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

这是一道和双向链表有关的题目,需要注意的是,child指针始终指向双向链表的头节点。

递归解法:

class Solution {
public:
    Node* flatten(Node* head) 
    {
        if(head == nullptr)
            return nullptr;
        if(head->child == nullptr)
            head->next = flatten(head->next);
        else
        {
            Node* n = flatten(head->next);
            Node* c = head->child;
            head->child = nullptr;
            c = flatten(c);
            c->prev = head;
            head->next = c;
            Node* p = c;
            while(c && c->next)
                c = c->next;
            c->next = n;
            if(n)
                n->prev = c;
        }
        return head;
    }
};

迭代解法:

class Solution {
public:
    Node* flatten(Node* head) 
    {
        if(head == nullptr)
            return nullptr;
        for(Node* p = head; p != nullptr; p = p->next)
        {
            Node* n = p->next;
            if(p->child != nullptr)
            {
                Node* c = p->child;
                p->next = c;
                c->prev = p;
                p->child = nullptr;
                Node* t = c;
                while(t && t->next)
                    t = t->next;
                t->next = n;
                if(n != nullptr)
                    n->prev = t;
            }
        }
        return head;
    }
};

 

    原文作者:胡小牛14
    原文地址: https://www.cnblogs.com/hlk09/p/9565674.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞