递归法实现对单链表的基本操作

为了熟悉递归的思想和用法,我采用递归的方式来实现单向链表的基本操作。单向的链表是一种应用指针且比较复杂的数据结构,但是其确实在很多情况下十分好用,在一般情况下递归都可采用迭代的形式实现,迭代的形式虽然相比递归要节省时间和空间,但是代码相对来说要复杂,递归往往只是简单的几句代码,就可以实现较为复杂的功能。以下是基本操作的部分代码:


typedef struct listnode
{
        int val;
        struct listnode *next;
}List;


/*统计节点个数*/
int count_listnode(List *head)
{
        
        if(head==NULL)
return 0;
else
return count_listnode(head->next)+1;


}


/*顺序打印*/
void fdprint_listnode(List *head)
{
        if(NULL != head)
        {
                printf("%d\t",head->val);
                fdprint_listnode(head->next);
        }
}
/*反向打印*/
void bkprint_listnode(List *head)
{
        if(head != NULL)
        {
                bkprint_listnode(head->next);
                printf("%d\t",head->val);
        }
}


/*最大值*/
int max_list(List *head)
{
        int max ;
        
        if(head->next==NULL)
max=head->val;
else
{
max=max_list(head->next);
if(head->val>max)
max=head->val;
}
return max;
}


/*最小值*/
int min_list(List *head)
{
        int min ;
        if(head->next==NULL)
min=head->val;
else
{
min=min_list(head->next);
if(head->val<min)
min=head->val;
}
return min;
        


       
}


/*创建链表*/
List* create_list(int *a,int n)
{
        List *head ;
if(n==0)
return NULL;
else
{
head=(List*)malloc(sizeof(List));
head->val=a[0];
head->next=create_list(a+1,n-1);
            return head;
}


/*输出单向链表奇数结点的值和奇数结点个数*/
int Oddvalue(List *head)
{
int cnt;
if(!head)
{
return 0;
}
else
{
cnt=Oddvalue(head->next);
if(head->val%2)
printf("%d",head->val);
return cnt+head->val%2;
}

递归中需要注意的思想通过这些基本操作基本可以掌握了,但若需要深入了解,还需要研究一些递归中较为复杂的经典问题,例如“汉诺塔”问题,在此不做说明。
 
递归通过对问题想这样逐层的分解,分解成很多相似的小事件,当最小的事件解决完成以后,就能解决高层次的事件,逐层合并的方式就构成了递归的思想,最主要的要找到递归的结束条件和递归的方式,只要搞定这两个“拦路虎”,实现一个递归问题就会比较简单啦。
 
当然递归也有其缺点,特别是深层次的递归可能导致栈空间的溢出,因为堆栈空间的大小并不是无限大的,特别当递归中数据量特别大的情况下,递归很有可能导致栈空间的溢出。还有就是对内存的大量占用导致效率低下,一个大型递归算法往往要计算机运行十几小时甚至几十小时。  这时具体的问题就要具体分析了。因此递归并不是万能的,但是递归确实是一种思考问题的方式,一种反向思考的形式,从结果到具体的过程。而这对于一个编程人员来说是很重要的。
 
递归的思想在数据结构和很多算法中应用很多,能使很多问题简化。以后还会有更加深入的分析,敬请期待吧。



  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值