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

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

思路:这道题直接用栈就阔以搞定,分三种情况:
1:如果当前节点有孩子节点,把当前节点的下一个节点放入栈中,并且把当前节点的孩子节点指向当前节点的下一个节点
2:否则如果当前节点的下一个节点为空且栈不为空(已经处理完所有的带孩子节点的节点,现在已经到了孩子节点的最后一个节点),那么显而易见的根据题意我们需要把孩子节点的最后一个节点指向当前节点。
3:每次都更新当前节点为下一个节点
参考代码:
/*
// Definition for a Node.
class Node {
public:
int val = NULL;
Node* prev = NULL;
Node* next = NULL;
Node* child = NULL;
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) return head;
Node* p = head;
stack<Node*> s;
while (p) {
if (p->child) {
s.push(p->next);
p->next = p->child;
if (p->next) p->next->prev = p;
p->child = nullptr;
}
else if (p->next == nullptr && !s.empty()) {
p->next = s.top(); s.pop();
if (p->next) p->next->prev = p;
}
p = p->next;
}
return head;
}
};
双向链表扁平化
本文介绍了一种解决多级双向链表扁平化的算法,通过使用栈来处理子节点和下一级节点的关系,实现将多层级双向链表转换为单一层次的双向链表。
745

被折叠的 条评论
为什么被折叠?



