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



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

题目链接地址:

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. 如何格式化被压缩的JS代码以方便阅读

    本文分两部分: 1.转载部分 2.个人补充部分 1.主题内容转载83,http://www.madeby83.com/unzip-the-js-code.html 我们经常可以看到一些网站,把所需的j ...

  2. 阻止 gulp 发生异常后退出

    gulp-plumber 可以阻止 gulp 插件发生错误导致进程退出并输出错误日志.

  3. PHP+MYSQL的搭建

    如今准备研究下微信的开发,所以要研究下PHP了,但对这个平台还是非常陌生的,所以网上找了些资料并測试,现贴出来给大家參考. 第一步:我们先下载[PHPStudy 2013]或者最新版本号: 下载地址: ...

  4. dubbo笔记

    使用Maven打包依赖项,启动时从本地jar中读取dubbo.xsd 最近项目用到dubbo,打包启动时报错 Failed to read schema document from http://co ...

  5. libevent2源码分析之五:关键的调用链

    用一个调用链来表示函数调用的流程,看起来更直观.根据上面的分析,总结了一些重要的调用链. 初始化 event_base_new event_base_new_with_config min_heap_ ...

  6. kinect脸部三维数据特征点标签语义具体说明

    非常多零零碎碎的事情,导致非常久没写blog了.face animation的demo做完了也快一个月了.是时候总结总结了. Kinect获得的标识点共用121个.其给的sdk里面也给出了响应的标签. ...

  7. STL源码剖析(空间配置器)

    前言 在STL中,容器的定义中都带一个模板参数,如vector template <class T, class Alloc = alloc> class vector {...} 其中第 ...

  8. java之生成jar包

    Java编写的application程序是否能够最终形成一个类似于exe一样的可执行文件,难道就只能用命令行运行?------------------------------------------- ...

  9. Caused by: org.hibernate.boot.registry.selector.spi.StrategySelectionException: Unable to resolve name [org.hibernate.cache.ehcache.EhCacheRegionFactory] as strategy [org.hibernate.cache.spi.RegionFac

    警告: Exception encountered during context initialization - cancelling refresh attempt: org.springfram ...

  10. centos7单机版安装hbase

    1.首先安装jdk1.8 yum install java-1.8.0-openjdk* -y 2.下载hbase 地址:http://mirrors.shuosc.org/apache/hbase/ ...