我理解的剑指Offer-------反转链表

题目描述:

输入一个链表,反转链表后,输出链表的所有元素。

输入:

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

输出:

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

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

我的理解:

       1.为了时间复杂度o(n),只能扫表一次。

       2.“链表反转” 一般人都会想到只要把不是头结点的结点指针都指向前一个就可以了。

       3。思路很简单,但是会遇到问题:链表操作都会怕遇到“断链”。如何解决这个问题是关键。

      4.开始结点、边界结点。

下面是解题思路和算法:

      


【解析】



【代码】

[cpp]  view plain copy
  1. /********************************* 
  2. *   日期:2013-11-21 
  3. *   作者:SJF0115 
  4. *   题号: 题目1518:反转链表 
  5. *   来源:http://ac.jobdu.com/problem.php?pid=1518 
  6. *   结果:AC 
  7. *   来源:剑指Offer 
  8. *   总结: 
  9. **********************************/  
  10. #include<iostream>  
  11. #include <stdio.h>  
  12. #include <malloc.h>  
  13. #include <string.h>  
  14. using namespace std;  
  15.   
  16. typedef struct ListNode{  
  17.     int value;  
  18.     struct ListNode *next;  
  19. }ListNode;  
  20.   
  21. ListNode* ReverseList(ListNode*head){  
  22.     //容错处理  
  23.     if(head == NULL){  
  24.         return NULL;  
  25.     }  
  26.     else{  
  27.         ListNode *p,*pre,*pnext;  
  28.         //带头节点的链表  
  29.         pre =  NULL;  
  30.         p = head->next;  
  31.         while(p != NULL){  
  32.             pnext = p->next;  
  33.             //最后一个节点  
  34.             if(pnext == NULL){  
  35.                 head = p;  
  36.             }  
  37.             p->next = pre;  
  38.             pre = p;  
  39.             p = pnext;  
  40.         }  
  41.         return head;  
  42.     }  
  43. }  
  44.   
  45. int main()  
  46. {  
  47.     int i,n;  
  48.     while(scanf("%d",&n) != EOF){  
  49.         ListNode *head,*p,*pre;  
  50.         //创建链表  
  51.         head = (ListNode*)malloc(sizeof(ListNode));  
  52.         head->next = NULL;  
  53.         pre = head;  
  54.         for(i = 0;i < n;i++){  
  55.             p = (ListNode*)malloc(sizeof(ListNode));  
  56.             scanf("%d",&p->value);  
  57.             p->next = NULL;  
  58.             pre->next = p;  
  59.             pre = p;  
  60.         }  
  61.         //无数据  
  62.         if(n <= 0){  
  63.             printf("NULL\n");  
  64.         }  
  65.         //输出反转后数据  
  66.         else{  
  67.             //反转  
  68.             head = ReverseList(head);  
  69.             //输出  
  70.             p = head;  
  71.             while(p != NULL){  
  72.                 if(p->next == NULL){  
  73.                     printf("%d\n",p->value);  
  74.                 }  
  75.                 else{  
  76.                     printf("%d ",p->value);  
  77.                 }  
  78.                 p = p->next;  
  79.             }  
  80.         }  
  81.     }  
  82.     return 0;  
  83. }  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值