17 - 01 - 02 单链表的逆置

来源:互联网 发布:网络同步时间在线 编辑:程序博客网 时间:2024/06/18 10:27
  /*单链表的逆置 是面试官非常青睐的题,这个题可以看出面试者对链表和指针的操作*/    /*代码如下*/#include <stdio.h>#include <stdlib.h>typedef struct node{    int data;    struct node*next;} Node;//创建链表Node *CreatList(void) {    int i, n;    Node *head, *p, *q;    head = NULL;    printf("输入要建立的链表长度:\n");    scanf("%d",&n);    printf("输入数据:\n");    for(i=0; i<n; ++i) {        p = (Node *)malloc(sizeof(Node));        scanf("%d", &p->data);        if(!p)  exit (0);        if(!head)  //先要执行这一步让head不为空            q = head = p;        else {            q->next = p;    //q = head;第一个节点建立。            q = p;    //1、     }    }*****思想:/*用p,q指向单链表中相邻的两节点,将r指向q的下一个结点,然后同步后移。当q=NULL时,表示指向原单链表的尾结点,将L的next域指向p即可*///链表的逆置Node *ReverseList(Node *head) {    Node *p, *q, *r;    p = head;    q=r=NULL;    while(p) {        q = p->next;   //最后一趟循环,p->next==NULL         p->next = r;             printf("%p\n",r);             printf("%p\n",p->next);        r = p;             printf("%p\n\n",r);        p = q;                }    return r;}

1 0