您将获得一个双向链表,除了下一个和前一个指针之外,它还有一个子指针,可能指向单独的双向链表。这些子列表可能有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示。
扁平化列表,使所有结点出现在单级双链表中。您将获得列表第一级的头部。
示例:
输入: 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
这是一道和双向链表有关的题目,需要注意的是,child指针始终指向双向链表的头节点。
递归解法:
class Solution { public: Node* flatten(Node* head) { if(head == nullptr) return nullptr; if(head->child == nullptr) head->next = flatten(head->next); else { Node* n = flatten(head->next); Node* c = head->child; head->child = nullptr; c = flatten(c); c->prev = head; head->next = c; Node* p = c; while(c && c->next) c = c->next; c->next = n; if(n) n->prev = c; } return head; } };
迭代解法:
class Solution { public: Node* flatten(Node* head) { if(head == nullptr) return nullptr; for(Node* p = head; p != nullptr; p = p->next) { Node* n = p->next; if(p->child != nullptr) { Node* c = p->child; p->next = c; c->prev = p; p->child = nullptr; Node* t = c; while(t && t->next) t = t->next; t->next = n; if(n != nullptr) n->prev = t; } } return head; } };