您将获得一个双向链表,除了下一个和前一个指针之外,它还有一个子指针,可能指向单独的双向链表。
这些子列表可能有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示。
扁平化列表,使所有结点出现在单级双链表中。您将获得列表第一级的头部。
示例:
输入: 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
以上示例的说明:
给出以下多级双向链表:

我们应该返回如下所示的扁平双向链表:

思路:
这是一道中等难度的题目。关键是理解节点cursor->child域不为空的节点代表这里有一个子链表,而子链表的尾部正好链接到 cursor->next即可。这里要注意是双向链表,所以cursor->next->prev = cursor也不要忘了,否则会像我一样卡很久找不出问题所在。因为有多级链表所以用栈去保存子链表的末尾,置入循环来保证cursor一直前进即可。不过我现在都没明白为什么得在链接末尾的时候,在循环里增加一个if(cursor->next == nullptr)的判断(不这样做会导致引用越界,我试出来的,你有什么头绪的话欢迎告诉我)。
AC代码:
/* // Definition for a Node. class Node { public: int val; Node* prev; Node* next; Node* child; Node() {} Node(int _val, Node* _prev, Node* _next, Node* _child) { val = _val; prev = _prev; next = _next; child = _child; } }; */ class Solution { public: Node* flatten(Node* head) { if(head == nullptr) return nullptr; stack<Node *> subListEnd; Node* cursor = head; while(cursor != nullptr) { if(cursor->child != nullptr) { subListEnd.push(cursor->next); cursor->next = cursor->child; cursor->next->prev = cursor; cursor->child = nullptr; } if(cursor->next == nullptr && !subListEnd.empty()) { cursor->next = subListEnd.top(); subListEnd.pop(); if(cursor->next == nullptr) break; cursor->next->prev = cursor; } cursor = cursor->next; } return head; } };
Published by