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;
}
};