单链表例题

设有一个正整数序列组成的有序单链表(按递增有序,且允许
有相等的整数存在),请设计一个用最小的时间和最小空间的算
法实现下列功能:
(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);
  }

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值