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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值