首页 > 代码库 > 剑指offer系列源码-反转链表

剑指offer系列源码-反转链表

题目1518:反转链表
时间限制:1 秒内存限制:128 兆特殊判题:否提交:1952解决:741
题目描述:
输入一个链表,反转链表后,输出链表的所有元素。
(hint : 请务必使用链表)
输入:
输入可能包含多个测试样例,输入以EOF结束。
对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000):代表将要输入的链表的个数。
输入的第二行包含n个整数t(0<=t<=1000000):代表链表元素。
输出:
对应每个测试案例,
以此输出链表反转后的元素,如没有元素则输出NULL。
样例输入:
5
1 2 3 4 5
0
样例输出:
5 4 3 2 1
NULL

oj地址

显示超时,大家看出问题,就帮忙解决吧。

#include<stdio.h>
#include<iostream>
using namespace std;
struct ListNode{
    int value;
    ListNode* next;
};
//反转链表
ListNode* reverseList(ListNode* root){
    if(root==NULL){
        return NULL;
    }
    if(root->next==NULL){
        return root;
    }
    ListNode* pNode = root;
    ListNode* preNode = NULL;
    while(pNode){
        ListNode* pNext = pNode->next;
        pNode->next = preNode;
        preNode = pNode;
        pNode = pNext;
    }
    return preNode;
}
int main(){
    int n;
    ListNode* root;
    ListNode* pNode;
    ListNode* pNew;
    while(scanf("%d",&n)){
        if(n<=0){
            printf("NULL\n");
            continue;
        }
        //构造链表
       for(int i=0;i<n;i++){
            pNew = new ListNode();
            scanf("%d",&pNew->value);
            pNew->next=NULL;
            if(i!=0){
                pNode->next = pNew;
                pNode = pNew;
            }else{
                pNode = root = pNew;
            }
       }
       //反转
       ListNode* reverseNode = reverseList(root);
       while(reverseNode->next){
            printf("%d ",reverseNode->value);
            reverseNode = reverseNode->next;
       }
       printf("%d\n",reverseNode->value);
    }
    return 0;
}

剑指offer系列源码-反转链表