设有一个正整数序列组成的有序单链表(按递增有序,且允许
有相等的整数存在),请设计一个用最小的时间和最小空间的算
法实现下列功能:
(a) 确定在序列中比正整数 x 大的数有几个(相
同的数只计算一次,如序列{3、5、6、6、8、10、11、13、13、
16、17、20、20}中比 10 大的数有 5 个);
(b) 将单链表中比正整数 x 小的数按递减次序排列;
(c) 将正整数比 x 大的偶数从单链表中删除。要求:
(1)描述算法的基本设计思想;
(2)根据设计思想,采用 C 或 C++语言描述算法,给出注释;
(3)说明你所设计的算法的时间复杂度和空间复杂度
参考答案:
L为带头结点的单链表,k为所需正整数
transform_list(LNode *L, int k)
{
LNode *p,*pre,*s,*r;
int c=0,pre_data;
p=L->next;r=p;pre_data=r->data;
while(p!=NULL)
{
if(p->data<=k)
{ s=p->next;
p->next=L->next;
L->next=p;
p=s;
}
else
{ if(pre_data!=p->data)
{
c=c+1;
pre_data=p->data;
}
if(p->data%2==0)
{ r->next=p->next;
free(p);
p=r->next;
}
else
{ r->next=p;
r=p;p=p->next;
}
}
}
printf("the node greater than %d is %d\n",k,c);
}