原題鏈接: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;
}