虽然步骤比较多,但是我认为是最方便理解的方法。
#include <stdio.h>
#include <stdlib.h>
struct node
{
int num;
node *next;
};
node *creat(int n) //创建链表的函数
{
node *head,*p,*prep; //分别为头指针、当前指针、前置指针
head=(node*)malloc(sizeof(node));
p=head;
prep=head;
scanf("%d",&p->num);
for(int i=1;i<n;i++)
{
p=(node*)malloc(sizeof(node));
scanf("%d",&p->num);
prep->next=p;
prep=p;
}
p->next=NULL;
return head;
}
node *reverse(node *head) //逆置链表的函数
{
node *prep,*p,*pnext; //分别为前置指针、当前指针、后继指针
prep=head;
p=head->next;
pnext=NULL;
while(p!=NULL)
{
pnext=p->next;
p->next=prep;
prep=p;
p=pnext;
}
head->next=NULL; //将逆置后的节点的最后一个节点的next指向NULL
head=prep; //新的头指针 (因为p==NULL,所以最后一个节点应该是prep指向的节点)
return head;
}
int main()
{
int n;
node *head;
scanf("%d",&n);
head=creat(n);
head=reverse(head);
for(int i=0;i<n;i++)
{
printf("%d ",head->num);
head=head->next;
}
return 0;
}
这个我最后测试的结果(应该没什么问题)