标题题目描述
你会得到一个双链表,其中包含的节点有一个下一个指针、一个前一个指针和一个额外的 子指针 。这个子指针可能指向一个单独的双向链表,也包含这些特殊的节点。这些子列表可以有一个或多个自己的子列表,以此类推,以生成如下面的示例所示的 多层数据结构 。
给定链表的头节点 head ,将链表 扁平化 ,以便所有节点都出现在单层双链表中。让 curr 是一个带有子列表的节点。子列表中的节点应该出现在扁平化列表中的 curr 之后 和 curr.next 之前 。
返回 扁平列表的 head 。列表中的节点必须将其 所有 子指针设置为 null
来源:力扣(LeetCode)
链接
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
最后返回的链表是
解题思路
这个方法又叫层层压缩法(是我自己起的名字,咳咳,专业一点叫递推)
- 不断地检索child节点,若不为空说明有下一层,然后就把下层的节点接到该节点的后面
- 不断重复上一个步骤,直到所有child节点都为空
可以看下图进行理解
-
第一次压缩
-
第二次压缩
下面是我的代码
Node* flatten(Node* head) {
Node* p=head,*q,*r;
if(head==NULL){
return head;
}
//层层压缩法
while(p!=NULL){
if(p->child!=NULL){
q=p->next;
r=p->child;
p->next=r;
r->prev=p;
p->child=NULL;
//走到下一层的末尾
while(r->next!=NULL){
r=r->next;
}
//把下一层接到本层
r->next=q;
if(q!=NULL){//防止q为链尾的NULL
q->prev=r;
}
}
p=p->next;
}
return head;
}
如果对你有所帮助,还往多多支持 谢谢!