原题链接:https://leetcode-cn.com/problems/flatten-a-multilevel-doubly-linked-list/
1、DFS+递归
Node* flatten(Node* head) {
next(head);
return head;
}
Node *child(Node *head){//遍历child方向上的元素,并且将下一层的元素与上一层的元素进行链接
Node *last=next(head->child);//返回next方向上最后一个元素
if(head->next==NULL){//将下一层的元素和上一层进行链接
last->next=NULL;
}else{
last->next=head->next;
head->next->prev=last;
}
head->next=head->child;
head->child->prev=head;
head->child=NULL;
return last;
}
Node *next(Node *head){//遍历next方向上的元素,返回next方向最后一个元素
while(head!=NULL){
if(head->child!=NULL){
head=child(head);
}
else{
if(head->next!=NULL){
head=head->next;
}
else{
return head;
}
}
}
return head;
}
2、左右子树版+DFS+递归
Node* flatten(Node* head) {
if(head==NULL) return head;
Node *dummy=new Node;//哑节点
dummy->next=head;
flattenDfs(dummy,head);
dummy->next->prev=NULL;//使head的prev为空
return dummy->next;
}
Node *flattenDfs(Node *pre,Node *head){//pre是head前一个节点
if(head==NULL) return pre;
pre->next=head;//链接pre和head
head->prev=pre;
Node *tmp=head->next;//保存head的下个节点,可以看成右子树
Node *tail=flattenDfs(head,head->child);//进入左子树,并且返回最后一个元素
head->child=NULL;//将head的chlid置空
return flattenDfs(tail,tmp);//进入右子树
}
3、左右子树版+DFS+迭代
Node* flatten(Node* head) {
if(head==NULL) return head;
Node *dummy=new Node;
Node *curr,*prev=dummy;
stack<Node*> s;
s.push(head);//头结点压栈
while(!s.empty()){
curr=s.top();
s.pop();
prev->next=curr;//建立prev与curr之间的双向链接
curr->prev=prev;
if(curr->next!=NULL) s.push(curr->next);//如果存在右指针,压栈
if(curr->child!=NULL){//如果存在左指针,压栈
s.push(curr->child);
curr->child=NULL;//并且删除child指针
}
prev=curr;
}
dummy->next->prev=NULL;
return dummy->next;
}