2019-11-04 扁平化多级双向链表

您将获得一个双向链表,除了下一个和前一个指针之外,它还有一个子指针,可能指向单独的双向链表。这些子列表可能有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示。

扁平化列表,使所有结点出现在单级双链表中。您将获得列表第一级的头部。

示例:
输入:

 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、当此节点在没有孩子节点的情况下,也没有下一个next节点说明到了末尾,则返回此节点的指针;否则,吧next节点的指针当作参数传入递归,重复判断;
3、当指针指到有孩子结点的节点时,首先将孩子节点child和当前节点的下一个next节点保存下来,然后将当前节点的next指向child节点,child节点也反过来prev指针指向当前节点。然后将此节点的child节点置为NULL。写一部依旧是把child节点作为参数进行递归,找到这条孩子链表的最后一个节点的指针child_tail,然后先判断next是否已经是NULL,若是则直接返回child_tail,否则将它与之前保存的next节点和这个child_tail链接起来。
经过上述一系列过程之后,直接返回原始的那个head指针,他就是链表的头指针,程序结束。

C++1
/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* prev;
    Node* next;
    Node* child;

    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) {
        flatten_tail(head);
        return head;
    }
    
    Node * flatten_tail(Node *head){
        if(!head){
            return head;
        }
        if(!head->child){
            if(!head->next){
                return head;
            }
            return flatten_tail(head->next);
        }else{
            Node *child = head->child;
            Node *next = head->next;
            head->next = child;
            child->prev = head;
            head->child = NULL;
            Node * child_tail = flatten_tail(child);
            if(next){
                child_tail->next = next;
                next->prev = child_tail;
                return flatten_tail(next);
            }
            return child_tail;
        }
    }
};

你可能感兴趣的:(2019-11-04 扁平化多级双向链表)