您的位置:首页 > 职场人生

《剑指Offer》面试题:反转链表

2015-09-04 20:12 597 查看
在这篇博文中:《剑指Offer》面试题:从尾到头打印链表,就应用过反转链表,这里重新又写里一篇。

实现代码如下

/*
反转链表 
*/

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef int ElementType;
//定义一个结构体 
struct ListNode{
    ElementType mValue;
    ListNode *pNext;
}; 
ListNode *createList(){
    ListNode *pHead=NULL;

    ElementType val;
    scanf("%d",&val);
    while(val!=-1){
        ListNode *pCurrentNode;
        ListNode *pNewNode;
        pNewNode=(ListNode *)malloc(sizeof(pNewNode));
        if(pNewNode==NULL){
            exit(EXIT_FAILURE);
        }
        pNewNode->mValue=val;
        pNewNode->pNext=NULL;
        if(pHead==NULL){
            pHead=pNewNode;
            pCurrentNode=pHead;

        }
        else{
            pCurrentNode->pNext=pNewNode;
            pCurrentNode=pNewNode;
        }

    scanf("%d",&val);   

    }
    return pHead; 
}
ListNode* reverseList(ListNode * pHead){
    if(pHead==NULL){//先检查下头结点是否有效 
        return NULL;
    }
    ListNode *preNode=NULL;
    ListNode *currNode=pHead;
    ListNode *next;
    while(currNode->pNext!=NULL){
        next=currNode->pNext;
        currNode->pNext=preNode;
        preNode=currNode; 

        currNode=next;
    }
    //反转最后一个结点
    pHead=currNode;
    currNode->pNext=preNode; 

    return pHead;
}
void printList(ListNode *pHead){
    if(pHead==NULL){
        return ;
    }
    while(pHead->pNext!=NULL){
        printf("  %d  ",pHead->mValue);
        pHead=pHead->pNext;
    }
    //输出最后一个结点
    printf("  %d\n ",pHead->mValue); 
}
int main(void){
    //第一步:在反转链表之前,先创建链表
    ListNode *pHead=createList(); 
    //为便于观察链表的结点,因此写一个输出链表的函数

    printList(pHead); 

    //第二步:反转链表
    pHead=reverseList(pHead); 

    printList(pHead);

    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: