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.思考
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;
}
};
430. Flatten a Multilevel Doubly Linked List--Medium
原文:https://www.cnblogs.com/xuyy-isee/p/11460358.html