思路是从头遍历双链表,每当遇到有子链表的节点,就递归地取出子链表,把子链表插到当前节点与下一节点之间。
class Solution {
public:
Node* flatten(Node* head) {
flattenGetTail(head);
return head;
}
//将当前层的链表展平
Node* flattenGetTail(Node* head)
{
Node* node = head;
Node* tail = nullptr;
while (node != nullptr)
{
Node* next = node->next; //保存后一节点
if (node->child != nullptr)
{
//这里注意:child代表子链表的头节点,childTail代表子链表的尾节点
Node* child = node->child;
Node* childTail = flattenGetTail(child); //递归展平子链表,并返回子的尾节点
node->child = nullptr; //切断child节点,只有切断了才变成双链表
node->next = child; //将展平的子链表头结点插入到node之后
child->prev = node;
childTail->next = next; //将展平的子链表尾节点插入到next之前
if (next != nullptr) next->prev = childTail;
tail = childTail; //将tail指向尾节点
}
else
{
tail = node; //没有child节点的情况,最后就直接返回当前节点
}
node = next; //前往下一节点,即:node = node->next
}
return tail; //返回该层链表的最后一个节点
}
};