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