430. Flatten a Multilevel Doubly Linked List--Medium

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:

We should return the following flattened doubly linked list:


1.思考

  • 该方法主要有以下几个重点:
    (1). 首先想到利用递归的方法深度搜索;
    (2). 其次保留本节点原先的下一跳节点rightList,即同一层右边的list;
    (3). 再将本节点与child建立双向连接;
    (4). 然后child的返回节点得是最后一个元素节点,而非NULL,所以用preNode保存curNode的上一跳节点;
    (5). 将child返回的节点与righList建立双向连接,这里要考虑rightList是否是一层的最后结尾。

2.实现
Runtime: 88ms(95%)
Memory: 31MB(100%)

/*
// 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) {
        Node *pHead = head;
        Node *curNode = FlattenList(head);
        return pHead;
    }
    
    Node* FlattenList(Node* head){
        Node *curNode = head, *preNode=NULL;
        while(curNode!=NULL){
            if(curNode->child!=NULL){
                //先保留同一层右边的list
                Node *rightList = curNode->next;
                //rightList->prev = NULL;
                //再与child节点建立双向指针
                curNode->next = curNode->child;
                curNode->next->prev = curNode;
                curNode->child = NULL;
                //深度搜索本节点的child
                curNode = FlattenList(curNode->next);
                //将child的最后一个节点与本节点的下一跳相连
                if(rightList==NULL){
                    return curNode;
                }
                curNode->next = rightList;
                rightList->prev = curNode;
            }
            //preNode为curNode的上一跳节点,防止curNode=NULL
            preNode = curNode;
            curNode = curNode->next;
        }
        return preNode;
    }
};
posted @ 2019-09-04 17:19  xuyy_isee  阅读(166)  评论(0编辑  收藏  举报