您的位置:首页 > 其它

续:一个带头结点的单链表反转(递归)

2012-12-12 16:21 501 查看
接着前面的循环算法(一个带头结点的单链表反转)实现的反转,再试试递归,主要是这个头结点的处理有点麻烦,不过还是解决了,不知道这样有什么缺陷?

递归的算法实现在代码的第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;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐