链表专题6.扁平化多级双向链表

您将获得一个双向链表,除了下一个和前一个指针之外,它还有一个子指针,可能指向单独的双向链表。这些子列表可能有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示。
扁平化列表,使所有结点出现在单级双链表中。您将获得列表第一级的头部。
示例:
输入:
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
如图所示:

在这里插入图片描述
解题思路:由图可知,有些节点包含了一个child指针会指向一个子链表,如上图依次移动,head值为1,2,3,7,8,11,12
因此我的想法是:创建一个指向head的newlist指针,并向后移动直至NULL,并对每一个节点进行检查是否含有child指针,如果含有,则将此时newlist后的链表用一个新的newnext指针进行保存,再将newlist->next指向其child子链表,同时创造一个p指针指向此时的newlist,向后移动找到其尾结点,将尾结点与newnext相连,把原本损失掉的数据连接在newlist之后,如此反复进行
代码实现:

class Solution {
public:
    Node* flatten(Node* head) {
        Node* newlist=head;
        while(newlist!=NULL){
            if(newlist->child!=NULL){
                Node* newnext=newlist->next;//用来保存此时newlist->next后的链表,比如4,5,6
                newlist->next=newlist->child;//将newlist此时的尾部连接到其child链表头,如第一次是3,7,8。。。
                newlist->next->prev=newlist;//因为是双向,所以要让next的prev指针指向前面
                newlist->child=NULL;//将child指针变成NULL
                Node* p=newlist;
                while(p->next!=NULL){//找到newlist此时的尾部节点
                    p=p->next;
                }
                p->next=newnext;
                if(newnext!=NULL){//需要判断是否为空因为其prev要指向p
                newnext->prev=p;}
                
            }
            newlist=newlist->next;
        }
        return head;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值