题目:具体图解可在leetcode查看
多级双向链表中,除了指向下一个节点和前一个节点指针之外,它还有一个子链表指针,可能指向单独的双向链表。这些子列表也可能会有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示。
给你位于列表第一级的头节点,请你扁平化列表,使所有结点出现在单级双链表中。
思路:深度遍历多级链表并用一个数组记录遍历节点,同时用一个辅助数组记录当前节点的遍历状态,为0说明反向遍历找下一个节点时忽略,为1则说明下一次遍历从该处开始。这样每次深度遍历到空指针时就回溯数组,直到某次回溯找不到下一次遍历开始的指针,说明所有节点都进入数组,此时修改数组内节点指针即可。
代码:
/*
// Definition for a Node.
class Node {
public:
int val;
Node* prev;
Node* next;
Node* child;
};
*/
class Solution {
public:
Node* flatten(Node* head) {
vector<Node *> rs;
vector<int> sign;
Node *nh = head;
if(nh == NULL)
return NULL;
//创建一个栈,按深度遍历原多级链表
while(1){
int flag = 1;
if(nh->child){
flag = 0;
rs.push_back(nh);
sign.push_back(1);
nh = nh->child;
}
else{
if(nh->next){
flag = 0;
rs.push_back(nh);
sign.push_back(0);
nh = nh->next;
}
else{
rs.push_back(nh);
sign.push_back(0);
for(int i = rs.size()-1;i>=0;i--){
if(rs[i]->next && sign[i]){
flag = 0;
nh = rs[i]->next;
sign[i] = 0;
break;
}
}
}
}
if(flag)
break;
}
/*每个节点都新建,解决无效双链表报错
Node *nhead = new Node;
nhead->next = NULL;
nhead->prev = NULL;
nhead->child = NULL;
Node *t = nhead;
//重新续接链表
for(int i = 0;i<rs.size();i++){
Node *temp = new Node;
temp->val = rs[i]->val;
temp->prev = t;
t->next = temp;
temp->next = NULL;
temp->child = NULL;
t = t->next;
}
nhead = nhead->next;
nhead->prev = NULL;
*/
//原出现无效双链表报错是因为头节点处有无效指针,现直接改变栈里指针也可
for(int i = 0;i<rs.size()-1;i++){
rs[i]->next = rs[i+1];
rs[i+1]->prev = rs[i];
rs[i]->child = NULL;
}
rs[rs.size()-1]->child = NULL;
rs[rs.size()-1]->next = NULL;
return rs[0];
}
};
提交: