单链表的递归和非递归逆置
#include <stdio.h>
#include <stdlib.h>
typedef char linktype;
typedef struct linklist{
linktype data;
struct linklist *next;
}linklist;
void linklistinit(linklist **head)
{
if(head == NULL)
{
return;
}
*head = NULL;
}
void linklistprint(linklist *head)
{
if(head == NULL)
{
return;
}
linklist *cur = head;
while(cur != NULL)
{
printf("%c",cur->data);
cur = cur->next;
}
printf("
");
}
linklist * creat(linktype value)
{
linklist *newnode = (linklist*)malloc(sizeof(linklist));
if(newnode == NULL)
{
return NULL;
}
newnode->data = value;
newnode->next = NULL;
return newnode;
}
void linklist_pushback(linklist **head,linktype value)
{
if(head == NULL)
{
return;
}
if(*head == NULL)
{
*head = creat(value);
return;
}
linklist *new = creat(value);
linklist *cur = *head;
while(cur ->next != NULL)
{
cur = cur->next;
}
cur->next = new;
}
linklist* linklist_nizhi1(linklist *head)
{
if(head == NULL || head->next == NULL)
{
return head;
}
linklist *newhead = linklist_nizhi1(head->next);//将递归到最后一个元素
//此时的head就是newhead的前一个元素,将这个元素的下一个的下一个指向自己
head->next->next = head;
//也就是说将newhead的下一个指向head,相当于翻转链表,从最后一个开始链
head->next = NULL;
//断开链表,防止成环
return newhead;
}
linklist *linklist_nizhi2(linklist *head)
{
if(head == NULL || head ->next == NULL)
{
return head;
}
linklist *p = head;
linklist *new = NULL;
while(p != NULL)
{
linklist *tmp = p->next;
//保存p的下一个元素位置
p->next = new;
//让当前p的笑一个指向前面的new,并且将new指向p,p指向tmp,也就相当于
//全部往后挪了一位,然后又开始了下一次交换。
new = p;
p = tmp;
}
return new;
}
int main()
{
linklist *head;
linklistinit(&head);
linklist_pushback(&head,a);
linklist_pushback(&head,b);
linklist_pushback(&head,c);
linklist_pushback(&head,d);
linklist *cur = linklist_nizhi1(head);//递归实现逆置
linklistprint(cur);
linklist *cur2 = linklist_nizhi2(cur);//非递归再逆置回来
linklistprint(cur2);
return 0;
}
结果