记得2012年笔试阿里云的时候,其中就有这么一题,是个填空题,这个问题比较绕,必须一步一图一代码的理解与思考。
其关键代码如下:void ReverseList(Node *L){
Node *p,*q;
p=L->next;
L->next=NULL;
while(p!=NULL){
q=p->next;
p->next=L->next;
L->next=p;
p=q;
}
}
上述代码有点绕,读者可以画一幅图,手动一行一行的执行,自然明了。
下面是代码是从创建链表、链表逆置、到打印链表的整个过程。
#include<stdio.h>
#include<malloc.h>
typedef struct Node{
int data;
struct Node *next;
}Node;
void Init(Node *L){
L=(Node*)malloc(sizeof(Node));
L->next=NULL;
}
void CrtList(Node *L){
Node *p,*q;
int e;
p=L;
printf("输入结点:\n");
scanf("%d",&e);
while(e!=0){
q=(Node*)malloc(sizeof(Node));
q->data=e;
p->next=q;
p=q;
fflush(stdin);
scanf("%d",&e);
}
p->next=NULL;
}
void ReverseList(Node *L){
Node *p,*q;
p=L->next;
L->next=NULL;
while(p!=NULL){
q=p->next;
p->next=L->next;
L->next=p;
p=q;
}
}
void Print(Node *L){
Node *p;
p=L->next;
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
putchar('\n');
}
void main(){
Node L;
Init(&L);
CrtList(&L);
printf("逆序前:\n");
Print(&L);
ReverseList(&L);
printf("逆序后:\n");
Print(&L);
}
运行示例: