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