• 链表顺序表 逆置、合并、分解算法总结


    //逆置不带头结点的单循环链表,有尾指针 
    void invert(LinkList &head){
        LNode *p,*a,*r;
        p=head->next;
        q=p->next;
        p->next=head;
        while(p!=head){
            r=q->next;
            q->next=p;
            p=q;
            q=r;
        }
    }
    //设计一个高效的算法 将递增有序La和Lb 合并成La(并集) 仍非递减有序 O(n) 不新建结点
    //链表
    LNode *MergeTwoList(LinkList &La,LinkList &Lb){
        LNode *p=La->next,*q=Lb->next;
        LNode *r=La;
        La->next=null;
        while(p!=null && q!=null){
            if(p->data<q->data){
                //尾插法
                r->next=p;
                r=p;
                p=p->next;
            }else if(p->data>q->data){
                r->next=q;
                r=q;
                q=q->next;
            }else{
                r->next=p;
                r=p;
                p=p->next;
                LNode *h=q;
                q=q->next;
                free(h);
            }
        }
        if(p!=null) r->next=p;
        if(q!=null) r->next=q;
    }
    //顺序表
    //设计一个高效的算法 将非递减有序La和Lb 合并成La(并集) 仍递减有序 O(n) 
    void MergeTwoList(Sqlist &La,Sqlist Lb){
        int i=La.length-1,j=Lb.length-1;
        int k=La.length+Lb.length;
        while(i>=0 && j>=0){
            if(La.data[i]>=Lb.data[j]){
                La.data[k--]=La.data[i--];
            }else{
                La.data[k--]=Lb.data[j--];
            }
        }
        while(j>0) La.data[k--]=Lb.data[j--];
    }
    //递增数组a[m]和又n个整数的递减数组b[n],将a和b归并为递增有序数组 O(m+n)
    void merge(int a[],int b[],int n,int m){
        int i,j,k;
        for(i=0,j=n-1;i<m && j>-1;k++){
            if(a[i]<b[j]){
                c[k]=a[i++];
            }else{
                c[k]=b[j--];
            }
        }
        while(i<m) c[k++]=a[i++];
        while(j>-1) c[k++]=b[j--];
    }
    //有一个单链表La分解成两个单链表,一个单链表存大于等于0的结点
    //另一个单链表存小于0的结点
    void DisCreate(LinkList &La){
        LNode *r,*p;
        LNode *b=(LNode *)malloc(sizeof(LNode));
        LNode *c=(LNode *)malloc(sizeof(LNode));
        b->next=null;
        c->next=null;
        p=La->next;
        while(p!=null){
            r=p->next;
            if(p->data>=0){
                p->next=b->next;
                b->next=p;
            }else{
                p->next=c->next;
                c->next=p;
            }
            p=r;
        }
    }
    //用单链表表示集合 设计一个算法求两个集合的差 A-B=元素在A中不在b中
    void difference(LinkList &A,LinkList &B,LinkList &C){
        LNode *p=A->next;
        LNode *q,*s,*r;
        C=(LNode*)malloc(sizeof(LNode));
        r=C;//尾插
        while(p!=null){
            q=B->next;
            while(q!=null && p->data!=q->data){
                q=q->next;
            }
            if(q==null){
                s=(LNode *)malloc(sizeof(LNode));
                s->data=p->data;
                r->next=s;
                r=s;
            }
            p=p->next;
        }
        r->next=null;
    }
    //顺序表 将所有负数移动到所有正数之前 O(n)
    void MoveNumber(int a[],int n){
        int k,i=-1,j=n;
        if(n>0){
            while(i<j){
                do i++;while(a[i]<0 && i>n);
                do j--;while(a[j]>=0 && j>=0);
                if(i<j){
                    swap(a[i],a[j]);
                }
            }
        }
    }
  • 相关阅读:
    IBinder介绍
    Android组成部分
    Android中handler,looper与messageQueue的代码解析
    JS
    设计模式
    冒泡排序
    战斗逻辑
    mongo数据库基础
    JS闭包
    c/c++
  • 原文地址:https://www.cnblogs.com/zzuuoo666/p/12100669.html
Copyright © 2020-2023  润新知