递归作为一种重要的算法思想,在链表中也有特别大的作用,特别是逆序输出时,代码更加简单。
以一个题为例:
设head指向一个非空单向链表:
1.输出链表所有结点的值
2.逆向输出所有结点的值
3.返回链表所有结点的和
4.返回链表奇数的个数
5.返回数据为key的结点地址,若未找到,返回NULL
首先,我们需要用递归创建一个链表。
ElemSN *CreatLink(int a[] , int n)
{
ElemSN *h;
if(n == 0)
return NULL;
else
{
h = (ElemSN *)malloc(sizeof(ElemSN));
h -> data = a[0];
h -> next = CreatLink(a + 1 , n - 1);
return h;
}
}
以下是各部分实现的代码:
/*正向输出链表*/
void PrintLink(ElemSN *h)
{
if(h)
{
printf("%d ",h -> data);
PrintLink(h -> next);
}
}
/*逆向输出*/
void PrintLink(ElemSN *h)
{
if(h)
{
PrintLink(h -> next);
printf("%d ",h -> data);
}
}
/*求和*/
int AddLink(ElemSN *h)
{
int sum = 0;
if(h)
sum = h -> data + AddLink(h -> next);
return sum;
}
/*求和*/
int AddLink(ElemSN *h)
{
int sum = 0;
if(h)
sum = h -> data + AddLink(h -> next);
return sum;
}
/*返回奇数结点个数*/
int Oddvalue(ElemSN *head)
{
int cnt;
if(!head)
{
return 0;
}
else
{
cnt = Oddvalue(head -> next);
return cnt + head -> data % 2;
}
}
/*返回key的地址*/
ElemSN *FindKey(ElemSN *h,int key)
{
if(h)
{
if(h -> data - key)
FindKey(h -> next , key);
else return h;
}
return NULL;
}