题目描述:
你会得到一个双链表,其中包含的节点有一个下一个指针、一个前一个指针和一个额外的 子指针 。这个子指针可能指向一个单独的双向链表,也包含这些特殊的节点。这些子列表可以有一个或多个自己的子列表,以此类推,以生成如下面的示例所示的 多层数据结构 。
给定链表的头节点 head ,将链表 扁平化 ,以便所有节点都出现在单层双链表中。让 curr
是一个带有子列表的节点。子列表中的节点应该出现在扁平化列表中的 curr
之后 和 curr.next
之前 。
返回 扁平列表的 head
。列表中的节点必须将其 所有 子指针设置为 null
。
示例:
代码(C++):
class Solution {
public:
Node* flatten(Node* head) {
if (head == nullptr) return nullptr;
Node* tmp = head;
while (tmp) {
if (tmp->child) {
Node* newHead = flatten(tmp->child);
tmp->child = nullptr;
Node* last = tmp->next;
tmp->next = newHead;
newHead->prev = tmp;
while (newHead && newHead->next) {
newHead = newHead->next;
}
newHead->next = last;
if (last)
last->prev = newHead;
tmp = last;
continue;
}
tmp = tmp->next;
}
return head;
}
};
说明: 采用递归算法。将双向链表进行遍历,若某节点存在孩子,进行递归将该节点的孩子传入递归函数中,递归函数返回的是以传入节点为头节点的扁平化后的双向链表,将返回的双向链表插入到上一级链表中即可。
注意细节:
1.扁平化后需要将孩子节点置为空(nullptr),否则报错。
2.需要考虑野指针的问题,在这到题中表现为nullptr指针不需要有prev/next/child指针。