zoukankan      html  css  js  c++  java
  • 链表的相关算法及应用(四)

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

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

    问题十三 :将两个递增的链表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;
    } 
  • 相关阅读:
    Javascript正则表达式详解转载
    转载Sqlserver2005 存储过程分页
    转载手把手教你用C#打包应用程序
    学习内容
    用C#实现将HTML文件转换为CHM文件(转)
    C# Windows服务添加安装程序
    sql 2008评估期已过有关如何升级,企业试用版到期,升级为企业版+sql2008破解
    iis不能启动是什么原因?错误提示:“提示服务器没有及时相应启动或控制请求”
    .NET 获取数据库中所有表名的方法
    如何获取Dynamics当前登录的用户的GUID,进而获取用户的信息
  • 原文地址:https://www.cnblogs.com/hekuiFlye/p/9365639.html
Copyright © 2011-2022 走看看