您将获得一个双向链表,除了下一个和前一个指针之外,它还有一个子指针,可能指向单独的双向链表。这些子列表可能有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示。
扁平化列表,使所有结点出现在单级双链表中。您将获得列表第一级的头部。
示例:
输入:
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
我的思路:
如上面示例所示,我遇到一个节点,比如说3号节点,发现它有孩子,然后我保存现场(保存3号节点的后一个节点4,下次将从4节点开始继续执行函数),递归,把它的孩子放入函数里再递归调用,重复上述过程,当发现子节点没有孩子之后,正常结束调用即可。
代码:
class Solution {
public:
Node* flatten(Node* head) {
Node *temp = head;
while (temp != NULL)
{
if (temp->child != NULL)//当发现有节点有孩子
{
Node *t1 = temp->next;//保存现场,保存当前节点的下一个节点,便于后面接上
Node *t2 = flatten(temp->child);//递归,把孩子节点的所有孩子都拿到,将返回孩子节点的头结点
temp->child = NULL;//题目要求,取得孩子之后,当前节点的孩子节点必须置空
temp->next = t2;//将当前节点的next变成孩子节点的头结点
t2->prev = temp;//孩子节点的头结点的prev变成当前节点
while (t2->next != NULL)//找到尾结点
{
t2 = t2->next;
}
t2->next = t1;//尾结点接上前面保存现场的节点
if (t1 != NULL)//保存现场的节点可能为空,要注意
t1->prev = t2;
temp = t1;//准备继续遍历
}
else//节点没有孩子,正常往下走就行
{
temp = temp->next;
}
}
return head;//返回头结点
}
};