//逆置不带头结点的单循环链表,有尾指针
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]);
}
}
}
}