【剑指offer】面试题16:反转链表

来源:互联网 发布:有话好好说 知乎 编辑:程序博客网 时间:2024/04/29 07:52


题目描述:

输入一个链表,反转链表后,输出链表的所有元素。
(hint : 请务必使用链表)

输入:

输入可能包含多个测试样例,输入以EOF结束。
对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000):代表将要输入的链表的个数。
输入的第二行包含n个整数t(0<=t<=1000000):代表链表元素。

输出:

对应每个测试案例,
以此输出链表反转后的元素,如没有元素则输出NULL。

样例输入:
51 2 3 4 50
样例输出:
5 4 3 2 1NULL


完整代码如下:

#include <stdio.h>#include <stdlib.h>typedef struct ListNode{    int data;    struct ListNode *next;}ListNode,*LinkList;void InitList(LinkList *head);void CreateList(LinkList head,int n);void DestoryList(LinkList head);void PrintList(LinkList head);void ReverseList(LinkList head);int main(void){    LinkList head;    int n;    InitList(&head);    while(scanf("%d",&n) == 1){        if(n<=0){            printf("NULL\n");            continue;        }        CreateList(head,n);//      PrintList(head);        ReverseList(head);        PrintList(head);        DestoryList(head);//      PrintList(head);    }    return 0;}//带有头结点的链表void InitList(LinkList *head){    *head = (LinkList)malloc(sizeof(ListNode));    if(!*head)        exit(-1);    (*head)->next = NULL;}void CreateList(LinkList head,int n){    LinkList p = head->next;    int e;    for(int i = 0;i < n;++i){        scanf("%d",&e);        LinkList q = (LinkList)malloc(sizeof(ListNode));        if(!q)            exit(-1);        q->data = e;        q->next = NULL;        if(p == NULL){            head->next = p = q;        }else{            p->next = q;            p = q;        }    }}void DestoryList(LinkList head){    LinkList p = head->next;    while(p){        LinkList q = p->next;        free(p);        p = q;    }    head->next = NULL;  //这句话必须加上}void PrintList(LinkList head){    LinkList p = head->next;    while(p){        printf("%d ",p->data);        p = p->next;    }    printf("\n");}void ReverseList(LinkList head){    LinkList pLow,pMid,pHight;    if(head == NULL){   //我们也要考虑当传入的指针为空的情况,尽管我们设置了头结点,但以防万一        return ;    }    if(head->next == NULL || head->next->next == NULL)        return ;    pLow = head->next;    pMid = pLow->next;    pHight = pMid->next;    pLow->next = NULL;  //指针的赋值考虑全,不然得不到可靠的程序    while(pMid){    //判断中间指针是否为空,        pMid->next = pLow;        if(pHight == NULL)  //必须判断,否则下面没法用pHight = pMid->next;            break;        pLow = pMid;        pMid = pHight;        pHight = pMid->next;    }    head->next = pMid;}





0 0
原创粉丝点击