单链表的翻转
方法一:
先看下面的图,我先定义三个结构体指针 n1是NULL,n2指向头部,n3是n2->next。
这时我们先让n2指向n1。
再让n1和n2和n3分分别向下走。
走完之后再让n2指向n1,就这样循环下去。
注意一下到最后是n2和n3都是NULL(我们上面写的是他们三个都要往下走,当n3是NULL时n2不是NULL,就还要往下走,但是NULL不能往下走所以我们要来个判断):说完了之后,我们看代码吧!
void ReverseList1(SL **phead)
{
SL *n1=NULL;
SL *n2=*phead;
SL *n3=n2->next;
if(*phead==NULL)
{
return;
}
while(n2!=NULL)
{
n2->next=n1; //翻转
n1=n2; //迭代往下走
n2=n3;
if(n3!=NULL) //这个就是我在括号里面写的注意
{
n3=n3->next;
}
}
*phead=n1; //n1跑到末尾,把头给它
}
这个是反转的核心代码,创建的话我觉得聪明的你肯定能搞定。
方法二:
这种方法是头插:
我们先看代码
void ReverseList2(SL **phead)
{
SL *cur=*phead;
SL *newhead=NULL;
while(cur)
{
SL *next=cur->next;
//头插
cur->next=newhead;
newhead=cur; //代表让newnode跟着cur走,在它的后面。
//迭代往后走
cur=next;
}
*phead=newhead;
}
这个代码其实很简单,就是一步一步让它往后指。
这两个都是核心的代码,希望可以帮到你。
我整体代码你可以看一下:
#include<stdio.h>
#include<stdlib.h>
typedef struct list
{
int a;
struct list *next;
}SL;
void CreateList(SL **phead)
{
printf("输入要创建的节点个数:\n");
int num;
scanf("%d",&num);
int i=1;
while(num>0)
{
SL *newnode=(SL *)malloc(sizeof(SL));
int data;
printf("请输入第%d个节点的数据:\n",i);
scanf("%d",&data);
newnode->a=data;
if(*phead==NULL)
{
*phead=newnode;
newnode->next=NULL;
}
else
{
SL *p=*phead;
while(p->next!=NULL)
{
p=p->next;
}
p->next=newnode;
newnode->next=NULL;
}
num--;
i++;
}
}
void ReverseList1(SL **phead)
{
SL *n1=NULL;
SL *n2=*phead;
SL *n3=n2->next;
if(*phead==NULL)
{
return;
}
while(n2!=NULL)
{
n2->next=n1; //翻转
n1=n2; //迭代往下走
n2=n3;
if(n3!=NULL)
{
n3=n3->next;
}
}
*phead=n1; //n1跑到末尾,把头给它
}
void ReverseList2(SL **phead)
{
SL *cur=*phead;
SL *newhead=NULL;
while(cur)
{
SL *next=cur->next;
//头插
cur->next=newhead;
newhead=cur;
//迭代往后走
cur=next;
}
*phead=newhead;
}
int ListLength(SL *phead)
{
SL *p=phead;
int i=0;
while(p!=NULL)
{
p=p->next;
i++;
}
return i;
}
void PrintList(SL *phead)
{
SL *p=phead;
while(p!=NULL)
{
printf("%d ",p->a);
p=p->next;
}
}
void test1()
{
SL *list=NULL;
CreateList(&list);
}
int main()
{
test1();
return 0;
}
``