zoukankan      html  css  js  c++  java
  • 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;
        }
    };
    
  • 相关阅读:
    setCapture 适用范围
    移动web页面自动探测电话号码
    WEB页面JS实现一键拨号的电话拨打功能
    highcharts动态删除标示区
    【你不知道的JavaScript
    【你不知道的JavaScript
    【JavaScipt高级程序设计 第4版】第5章笔记 日期格式
    【JavaScipt高级程序设计 第4版】第6章笔记 Map Set
    【JavaScipt高级程序设计 第4版】第6章笔记 Array 集合引用类型
    【JavaScipt高级程序设计 第4版】第4章笔记
  • 原文地址:https://www.cnblogs.com/xuyy-isee/p/11460358.html
Copyright © 2011-2022 走看看