与其非常快写出一段漏洞百出的代码,倒不如细致分析再写出鲁棒的代码。



提前想好測试用例(输入非空等等)进行測试改动代码。

题目链接地址:

http://ac.jobdu.com/problem.php?pid=1518

题目1518:反转链表

时间限制:1 秒内存限制:128 兆特殊判题:否提交:2606解决:957

题目描写叙述:

输入一个链表,反转链表后。输出链表的全部元素。

(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


思路分析:

反转链表是经典的链表题。反转单链表须要将链表中的每一个结点的next指针指向该结点所相应的前一个结点。

这就会出现两个问题:

(1) 由于单链表中的结点仅仅有一个指向下一个结点的next指针,没有指向前一个结点的指针,所以须要用一个指针pPre “记录”该结点的前一个结点;

(2)当我们把链表结点的next指针改为指向该结点的前一个结点后。该结点与下一个结点的链接就断开了,所以还须要用一个指针pNext“记住”下一个结点的位置。

所以须要设置三个指针,分别指向当前要反转的节点、当前要反转节点的前一个节点、当前要反转节点的下一个节点。

须要注意的是对于空链表和长度为1的链表,直接返回。不须要进行反转操作。



时间复杂度O(n)

空间复杂度O(1)


代码:

/*********************************
【剑指Offer面试题】 九度OJ1518:反转链表
Author:牧之丶 Date:2015年
Email:bzhou84@163.com
**********************************/
#include<stdio.h>
#include<stdlib.h>
#include<string>
#include <math.h>
#include<stack>
#include <vector>
#include <iostream>
using namespace std; typedef struct Node
{
int data;
struct Node *pNext;
}LNode; /*
反转链表。返回翻转后的头结点
*/
LNode* ReverseList(LNode* pHead)
{
if(pHead == NULL)
return NULL;
if(pHead->pNext == NULL)
return pHead;
LNode* pCur = pHead; //当前节点指针
LNode* pPre = NULL; //当前节点的前一个节点指针
while(pCur != NULL)
{
LNode* pNext = pCur->pNext;//当前节点的后一个节点指针
pCur->pNext = pPre; //反转当前节点的指针指向前一个节点
pPre = pCur; //指针右移
pCur = pNext; //指针右移
}
return pPre; //也即反转后的头指针
} int main()
{
int n,k;
while(scanf("%d",&n) != EOF)
{
LNode* pHead=NULL;
if (n>0)
{
int i,data;
scanf("%d",&data);
pHead =(LNode*)malloc(sizeof(LNode)); //不带头结点建单链表
if(pHead == NULL)
exit(EXIT_FAILURE);
pHead->data = data;
pHead->pNext = NULL; LNode* pCur = pHead;
for(i=0;i<n-1;i++)
{
scanf("%d",&data);
LNode* pNew =(LNode* )malloc(sizeof(LNode));
if(pNew == NULL)
exit(EXIT_FAILURE);
pNew->data = data;
pNew->pNext = NULL;
pCur->pNext = pNew;
pCur = pCur->pNext;
}
} LNode* pNewHead = ReverseList(pHead);
if(pNewHead == NULL)
printf("NULL\n");
else
{
LNode* pCur = pNewHead;
while(pCur != NULL)
{
//这里主要时要注意输出的格式
if(pCur->pNext == NULL)
printf("%d\n",pCur->data);
else
printf("%d ",pCur->data);
pCur = pCur->pNext;
}
}
}
return 0;
} /**************************************************************
Problem: 1518
Language: C++
Result: Accepted
Time:160 ms
Memory:2972 kb
****************************************************************/

总结:

  • 反转链表设置三个指针。分别指向当前要反转的节点、当前要反转节点的前一个节点、当前要反转节点的下一个节点。
  • 功能測试提前想好測试用例。

【剑指Offer面试题】 九度OJ1518:反转链表的更多相关文章

  1. C++版 - 剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告

    剑指offer之面试题37 两个链表的第一个公共结点 提交网址: http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?t ...

  2. 剑指offer——面试题18.1:删除链表中重复的节点

    // 面试题18(二):删除链表中重复的结点 // 题目:在一个排序的链表中,如何删除重复的结点?例如,在图3.4(a)中重复 // 结点被删除之后,链表如图3.4(b)所示. #include &l ...

  3. 剑指Offer面试题:31.两个链表的第一个公共节点

    一.题目:两个链表的第一个公共节点 题目:输入两个链表,找出它们的第一个公共结点. 链表结点定义如下,这里使用C#语言描述: public class Node { public int key; p ...

  4. 剑指Offer:面试题26——复制复杂的链表(java实现)

    问题描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点). 思路1: 1.先复制链表节点,并用next链接起来. 2.然后对每一个结点去修改 ...

  5. 《剑指offer》— JavaScript(15)反转链表

    反转链表 题目描述 输入一个链表,反转链表后,输出链表的所有元素. *** 思路 (本题链表默认无头结点) pHead为当前结点,如果当前结点为空的话,直接返回: pHead为当前结点,pre为当前结 ...

  6. 【剑指Offer面试题】 九度OJ1389:变态跳楼梯

    转自:http://www.myexception.cn/program/1973966.html 时间限制:1 秒内存限制:32 兆特殊判题:否提交:2331解决:1332 题目描述: 一只青蛙一次 ...

  7. 【剑指Offer面试题】 九度OJ1368:二叉树中和为某一值的路径

    题目链接地址: http://ac.jobdu.com/problem.php? pid=1368 题目1368:二叉树中和为某一值的路径 时间限制:1 秒内存限制:32 兆特殊判题:否提交:2252 ...

  8. 【剑指Offer面试题】 九度OJ1517:链表中倒数第k个结点

    鲁棒性是指程序可以推断输入是否符合规范要求,并对不和要求的输入予以 合理的处理. 题目链接地址: http://ac.jobdu.com/problem.php?pid=1517 题目1517:链表中 ...

  9. 【剑指Offer面试题】 九度OJ1385:重建二叉树

    题目链接地址: pid=1385">http://ac.jobdu.com/problem.php?pid=1385 题目1385:重建二叉树 时间限制:1 秒内存限制:32 兆特殊判 ...

随机推荐

  1. Yii2 关于时间格式的用法

    先添加配置文件: 'language' => 'zh-CN', 'timeZone' => 'Asia/Shanghai', 'components' => [ 'formatter ...

  2. 【OpenStack项目管理-CPU/内存/存储/网络 配额管理】

    参考资料: OpenStack如何管理项目和用户:http://os.51cto.com/art/201312/422010.htm Nova.Cinder.Neutron资源配额设置:http:// ...

  3. appium自动化,失败自动截图

    1.创建监听器类TestNGListener,重写onTestFailure方法,里面定义了 监听的driver ,截图文件路径和名称 package utils; import cases.Appi ...

  4. JAVA加解密 -- 数字签名算法

    数字签名 – 带有密钥的消息摘要算法 作用:验证数据完整性.认证数据来源.抗否认(OSI参考模型) 私钥签名,公钥验证 RSA 包含非对称算法和数字签名算法 实现代码: //1.初始化密钥 KeyPa ...

  5. [Unity3D]UI方案及制作细节(NGUI/EZGUI/原生UI系统)

    转载请留下本文原始链接,谢谢.本文会不定期更新维护,最近更新于2013.09.17.   http://blog.sina.com.cn/s/blog_5b6cb9500101bplv.html   ...

  6. Joomla详细安装图文教程

    Joomla 详细安装图文教程 第一步,配置网站信息 配置数据库:这里我选择MySQLi,可以根据自己的选择         安装-- 安装完成!

  7. Android Exception 15(关于使用RecyclerView的异常)

    04-07 16:32:32.815: E/AndroidRuntime(16173): FATAL EXCEPTION: main 04-07 16:32:32.815: E/AndroidRunt ...

  8. 移动负载均衡技术(MBL)

    移动负载均衡技术(MBL)   转至元数据结尾 附件:5 被admin添加,被admin最后更新于四月 27, 2015 转至元数据起始 互联网技术发展到今天,已经进入移动时代,很多在传统CS和BS的 ...

  9. 自定义通用dialogFragment

    代码地址如下:http://www.demodashi.com/demo/12844.html 前言 之前写过一篇dialogFragmnet封装默认dialog的文章 DialogFragment创 ...

  10. Service(1)

    服务是一个应用组件,能够在后运行耗时的操作,不提供一个用户界面.(由于不提供界面,所以能够耗时运行,和活动最大的不同).还有一个应用组件能够启动一个服务,服务会继续在后台运行及时用户切换到还有一个应用 ...