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


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

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

    问题十三 :将两个递增的链表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;
    } 
  • 相关阅读:
    kill eclipse
    C语言之表达式运算整体提升
    查找函数对比:findall,search,match
    Linux backtrace()
    git本地协同
    git 撤销push到服务器的代码
    gtest
    C陷阱篇之enum默认长度
    程序员中文开发者手册
    C语言错题分析
  • 原文地址:https://www.cnblogs.com/hekuiFlye/p/9365639.html
Copyright © 2020-2023  润新知