zoukankan      html  css  js  c++  java
  • 链表顺序表 逆置、合并、分解算法总结

    //逆置不带头结点的单循环链表,有尾指针 
    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]);
                }
            }
        }
    }
  • 相关阅读:
    JS站点
    1011 World Cup Betting (20分)
    1007 Maximum Subsequence Sum (25分)(动态规划DP)
    1006 Sign In and Sign Out (25分)
    1005 Spell It Right (20分)
    1004 Counting Leaves (30分)(DFS)
    1003 Emergency (25分)(Dijkstra算法)
    1002 A+B for Polynomials (25分)
    1001 A+B Format (20分)
    canvas
  • 原文地址:https://www.cnblogs.com/zzuuoo666/p/12100669.html
Copyright © 2011-2022 走看看