思路:
展平的规律是一个节点的子链展平后之后将插入该节点和它的下一个节点之间。也就是我们如果查到一个节点有子链,那么我们需要知道子链的最后一个节点,这样再把最后一个节点的next指向主链的next,再修改prev的值,就能实现插入子链的操作了。
因为子链还可能有子链,所以我们要用遍历的方式。
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)
{
Node* child = node->child;
Node* childTail = flattenGetTail(node->child);
node->child = nullptr;
node->next = child;
child->prev = node;
childTail->next = next;
if (next != nullptr)
{
next->prev = childTail;
}
tail = childTail;
}
else
tail = node;
node = next;
}
return tail;
}
};