题目:设有不带表头结点的单链表,表中元素各不相同,设计一个算法找出单链表的最小值,并将其插入到链表中第一个结点之前。
思路:定义三个指针,一个q用来比较,一个p用来标记min的位置,一个r用来标记min前一个位置。
注意:要分类讨论。min在第一位的时候,不需要变化。min在第二位的时候,只要让r指向first就行。min在后面其他位置。
代码:
Status Min(SingleList *L, int n){
Node *r,*q,*p=L->first;
int i,x=0;
q=p;
r=L->first;
for(i=1;i<n;i++){
q=q->link;
if(q->element<p->element){ // 查找min返回下标i到x中
p=q;
x=i;
}
}
if(x==0){
return OK; // 本来第一位就是min
}
else if(x==1){ // 第二位是min
L->first=p;
r->link=p->link;
L->first->link=r;
}
else{
for(i=0;i<x-1;i++){
r=r->link; // 找到min的前一个位置
}
r->link=p->link;
p->link=L->first;