您将获得一个双向链表,除了下一个和前一个指针之外,它还有一个子指针,可能指向单独的双向链表。这些子列表可能有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示。
扁平化列表,使所有结点出现在单级双链表中。您将获得列表第一级的头部。
示例:
输入:
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
以上示例的说明:
给出以下多级双向链表:
![](https://img.haomeiwen.com/i6638651/7db882c13c5d88f1.png)
我们应该返回如下所示的扁平双向链表:
![](https://img.haomeiwen.com/i6638651/7d0089bf56170f28.png)
方法很简单,关键是思路请不清晰。
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;
}
}
};
网友评论