• 链表的相关算法及应用(四)


    问题十一 :将两个递增的链表合并为一个递增的链表 

    问题十二 :将两个递增的链表合并为一个递减的链表,并用原来的两个单链表的节点存放归并后的单链表

    问题十三 :将两个递增的链表A B的交集存放与A中

    问题十四 :序列A B 存入了两个单链表,判断B是否是A的连续子序列 // 此处暴力枚举法 改进请参考KMP算法

    问题十五 :删除倒数第n个节点

    //问题十一 将两个递增的链表合并为一个递增的链表 
    void mergeList(LinkList &A,LinkList &B){
        LNode *a=A->next,*b=B->next,*p=A;
        while(a!=NULL&&b!=NULL){
            if(a->data<=b->data){
                p->next=a;
                p=a;
                a=a->next;
            }else{
                p->next=b;
                p=b;
                b=b->next;
            }
        }
        if(a)
            p->next=a;
        if(b)
            p->next=b;
            
    }
    //问题十二 将两个递增的链表合并为一个递减的链表 
    //            并用原来的两个单链表的节点存放归并后的单链表 
    LinkList mergeList2(LinkList &A,LinkList &B){
        LinkList C = (LinkList)malloc(sizeof(LNode));
        C->next=NULL;
        LNode *a=A->next,*b=B->next,*p=A,*r;
        while(a!=NULL&&b!=NULL){
            if(a->data<=b->data){
                r=a->next;
                a->next=C->next;
                C->next=a;
                a=r;
            }else{
                r=b->next;
                b->next = C->next;
                C->next=b;
                b=r;
            }
        }
        a = a==NULL?b:a;
        while(a){
            r=a->next;
            a->next=C->next;
            C->next=a;
            a=r;
        }
        return C;    
    }
    // 问题十三 将两个递增的链表A B的交集存放与A中
    LinkList Union(LinkList &A,LinkList &B){
        LNode *a=A->next,*b=B->next,*p=A,*t;
        while(a!=NULL&&b!=NULL){
            if(a->data==b->data){
                p->next=a;
                p=a;
                a=a->next;
                t=b;
                b=b->next;
                free(t);
            }else if(a->data<b->data){
                t=a;
                a=a->next;
                free(t);
            }else{
                t=b;
                b=b->next;
                free(t);
            }
        }
        free(B);    
        return A;
    } 
    // 问题十四 序列A B 存入了两个单链表,判断B是否是A的连续子序列
    // 暴力枚举法 改进请参考KMP算法 
     LNode *isSubSeq(LinkList A,LinkList B){
         LNode *a=A->next,*b=B->next;
         LNode *r=a; 
        while(r){
            a=r;
             b=B->next;
             while(a!=NULL&&b!=NULL&&a->data==b->data){
                a=a->next;             
                b=b->next;
            }
            if(b==NULL){
                return r;    //匹配成功 返回在A中成功匹配的第一个节点 
            }
            r=r->next;
         }
        return NULL;        //匹配失败 返回NULL     
     } 
    //删除倒数第n个节点
    void delLastN(LinkList &L,int n){
        LNode *r=L->next,*l=L->next;
        
        for(int i=1;i<n;i++){
            r=r->next;
        }
        
        while(r->next->next!=NULL){
            l=l->next;
            r=r->next;
        }
        l->next=l->next->next;
    } 
  • 相关阅读:
    [洛谷P4513][题解]小白逛公园
    [洛谷P2564][题解][SCOI2009]生日礼物
    [洛谷P3384][题解]轻重链剖分
    [洛谷P2607][题解][ZJOI2008]骑士
    第一次个人编程作业
    第一次博客作业
    第一次个人编程作业
    第一次博客作业
    1.初识数据库系统
    1.计算机发展历程
  • 原文地址:https://www.cnblogs.com/hekuiFlye/p/9365639.html
Copyright © 2020-2023  润新知