单链表的递归和非递归逆置
#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("\n");
}
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->next->next = 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->next = new;
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;
}
结果