接着前面的循环算法(一个带头结点的单链表反转)实现的反转,再试试递归,主要是这个头结点的处理有点麻烦,不过还是解决了,不知道这样有什么缺陷?
递归的算法实现在代码的第72行开始。
#include<stdio.h>
#include<malloc.h>
typedef char ElemType;
typedef struct Node{
ElemType data;
struct Node *next;
}SLink;
void InitLink(SLink *&Head)
{
Head = (SLink *)malloc(sizeof(SLink));
Head->next = NULL;
}
int GetLength(SLink *Head)
{
int i=0;
SLink *p = Head->next;
while(NULL != p)
{
p = p->next;
i++;
}
return i;
}
bool InsertNode(SLink *Head,int i,ElemType dt)
{
int j=1;
SLink *p = Head;
if(i<1 || i>GetLength(Head)+1)
return false;
SLink *newNode = (SLink *)malloc(sizeof(SLink));
newNode->next = NULL;
newNode->data = dt;
while(j<i)
{
p = p->next;
j++;
}
newNode->next = p->next;
p->next = newNode;
return true;
}
bool Reverse(SLink *&Head)
{
if(NULL == Head->next)
return false;
SLink *pre = Head->next;
if (NULL == pre->next)
{
return false;
}
SLink *cur = pre->next,*tmp;
pre->next = NULL;
while(NULL != cur)
{
tmp = cur->next;
cur->next = pre;
pre = cur;
cur = tmp;
}
Head->next = pre;
return true;
}
bool ReverseRecursion(SLink *&Head,SLink *newHead = NULL)
{
static bool twonodes_flag = false;
static SLink *save_head = Head;
SLink *cur = Head,*next;
if(twonodes_flag == false)
{
if (NULL == Head->next || NULL == Head->next->next)
{
return false;
}
twonodes_flag = true;
cur = Head->next;
}
next = cur->next;
cur->next = newHead;
newHead = cur;
if(NULL != next)
{
return ReverseRecursion(next,newHead);
}
else
{
save_head->next = cur;
return true;
}
}
void Display(SLink *Head)
{
SLink *p = Head->next;
while(NULL != p)
{
printf(" %c ",p->data);
p = p->next;
}
printf("\n");
}
int main()
{
SLink *L;
InitLink(L);
for(int i=1; i<10; i++)
{
InsertNode(L,i,'A'+i-1);
}
Display(L);
Reverse(L);
printf("After Reverse the link is:\n");
Display(L);
ReverseRecursion(L);
printf("After ReverseRecursion the link is:\n");
Display(L);
return 0;
}