算法源码之单链表逆置

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


运行示例:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值