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

//逆置不带头结点的单循环链表,有尾指针 
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]);
            }
        }
    }
}
posted @ 2019-12-26 10:24  ZzUuOo666  阅读(385)  评论(0编辑  收藏  举报