扁平化多级双向链表
您将获得一个双向链表,除了下一个和前一个指针之外,它还有一个子指针,可能指向单独的双向链表。这些子列表可能有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示。
扁平化列表,使所有结点出现在单级双链表中。您将获得列表第一级的头部。
输入: 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
给出以下多级双向链表:
我们应该返回如下所示的扁平双向链表:
/* // Definition for a Node. class Node { public: int val; Node* prev; Node* next; Node* child; }; */ class Solution { public: Node* flatten(Node* head, bool isChild = false) { if(head == NULL){ return head; } Node *p = head; while(p->next != NULL && p->child == NULL){ p = p->next; } if(p->child != NULL){ Node *parent_head = flatten(p->next, false); p->next = p->child; p->next->prev = p; Node *child_tail = flatten(p->child, true); p->child = NULL; child_tail->next = parent_head; if(parent_head != NULL){ parent_head->prev = child_tail; } while(p->next != NULL){ p = p->next; } } if(isChild){ return p; } else{ return head; } } };
解题思路:
递归分左右递归,假设左是值child,右是指parent。
当右递归到底的时候,返回其头结点。
当左递归到底的时候,返回其尾结点。
然后将右递归的头结点接到左递归的尾结点,完成扁平化。
需要注意的是,每次扁平化完后,要把p指针指到扁平化后的子链表尾部。