leetcode算法題--扁平化多級雙向鏈表★

原題鏈接: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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章