算法源码之单链表逆置

来源:互联网 发布:淘宝虚拟商品怎么发货 编辑:程序博客网 时间:2024/05/24 20:06

  记得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);}


运行示例: