题目描述:
你会得到一个双链表,其中包含的节点有一个下一个指针、一个前一个指针和一个额外的 子指针 。这个子指针可能指向一个单独的双向链表,也包含这些特殊的节点。这些子列表可以有一个或多个自己的子列表,以此类推,以生成如下面的示例所示的 多层数据结构 。
给定链表的头节点 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指针。
双向链表扁平化
该文章描述了一个C++实现的解决方案,用于将具有子指针的多层双向链表扁平化。使用递归算法遍历链表,当遇到含有子链表的节点时,递归处理子链表,并将其插入到主链表中,确保扁平化后的链表中所有子节点位于原节点之后、下一个节点之前。同时,扁平化后会将子指针设为null以满足要求。





