下面代码给出实现逆置的两种方法 分别是迭代法和递归法
迭代法:单链表逆置问题在于当改变其中任意节点的next指向后 就找不到当前节点的后续节点了
于是构造多个指针 分别指向当前节点的前驱 本身 后继
递归法:递归到最后一层 从最后一层分别往前指 但要注意不能产生循环链表 导致死循环
//原地翻转单链表 不开辟额外空间
//迭代法
#include <stdio.h>
#include <stdbool.h>
#include <malloc.h>
typedef struct ListNode
{
int data;
struct ListNode* next;
}ListNode,*LinkNode;
//初始化节点
bool InitNode(LinkNode L)
{
L->data=8;
L->next=NULL;
return true;
}
//增 头插法
bool InsertNode(LinkNode L,int data)
{
LinkNode p=malloc((LinkNode)sizeof(ListNode));
p->next=L->next;
p->data=data;
L->next=p;
return true;
}
//打印
void PrintNode(LinkNode L)
{
if(L->next==NULL)
{
printf("空链表\n\n");
}
LinkNode p=L;
while(p!=NULL)
{
printf("%d\t",p->data);
p=p->next;
}
printf("\n");
}
迭代法翻转 - - -
//LinkNode Reserve(LinkNode L)
//{
// LinkNode beg=NULL;
// LinkNode mid=L;
// LinkNode end=L->next;
//
// while(end!=NULL)
// {
// mid->next=beg;
//
// beg=mid;
// mid=end;
// end=end->next;
// }
// mid->next=beg;
//
// L=mid;
//
// return L;
//}
//递归法
LinkNode Reserve(LinkNode L)
{
if(L->next==NULL||L==NULL)
{
return L;
}
LinkNode p=Reserve(L->next);
L->next->next=L; //共有n-1个L->next 节点
L->next=NULL; //防止形成环 导致死循环
return p;
}
int main()
{
LinkNode L=malloc((LinkNode)sizeof(ListNode));
InitNode(L);
int i=0;
for(i=0;i<10;i++)
{
InsertNode(L,i);
}
L=Reserve(L);
PrintNode(L);
return 0;
}