第一次改代码改到了现在,也体会到了出思路和Debug的不易。
其实有时候觉得,做算法题还是很快乐的。
不多说了,下面开始代码分享了。
链表储存结构:
typedef struct LNode{
int data;
LNode *next;
}LNode,*LinkList;
1.将循环链表就地逆序
首先,给出验证代码
(1)显示链表L
void display(LinkList L)
{ LinkList p;
p = L->next;
printf("\n");
while(p)
{
printf("%d-> ",p->data);
p = p->next;
}
}
(2)建立循环链表L
void Insert_xunhuan(LinkList &L,int e){
LinkList p=L,s;
if(L->next!=NULL) p=L->next;
while(p->next!=L->next){ //找到尾结点
p=p->next;
}
s=new LNode ; 插入节点
s->data=e;
p->next=s;
s->next=L->next;
}
(3)就地逆置
void Trans(LinkList &L){
LinkList p=L->next,f,m,b;
f=p;
m=f->next;
b=m->next;
while(b!=L->next){
m->next=f;
f=m;m=b;b=b->next;
}
m->next=f;
L->next=m;
p->next=m;
}
原理:运用了三个指针进行改变顺序。
2.删除链表中大于等于mink且小于等于maxk的值
void Delete(LinkList &L,int min,int max){
LinkList p=L,q=L->next,r;
if(max<min){
printf("输入错误!");
return;
}
if(p->next->data>min) return;
while((p->next->data<min)&&p) p=p->next; //p指向min前一个值
while(q->next&&(q->data<max)) q=q->next; //q指向max值
r=p->next; //r指向min值
p->next=q->next; //修改指针
while(r!=q){ //释放结点
p=r->next;
free(r);
r=p;
}
free(q);
}
该代码的难点在于如何考虑多种情况发生带来的错误值。
今天代码分享就到这里,以上,祝好。