题目:定义一个函数,输入一个链表的头节点,反转该链表并输出反转链表的头节点。

思路:对一个链表反转需要三个指针操作来保证链表在反转的过程中保证不断链,给链表一个行动指针pNode,对pNode指向的节点进行反转就是让它指向的下一个节点,变成指向上一个节点,因此我们要用一个指针pre来指向上一个节点。用pNext来保存pNode->m_pNext.避免在进行反转操作时,断链(如下图所示,对i进行反转)。

C++代码:

#include<iostream>
using namespace std;
struct ListNode
{
int m_nValue;
ListNode* m_pNext;
};
ListNode* createList(int a[],int k)
{
ListNode* pHead=NULL,*pNode=NULL;
for(int i=;i<k;i++)
{
ListNode* pNew=new ListNode();
pNew->m_nValue=a[i];
pNew->m_pNext=NULL;
if(pHead==NULL)
{
pHead=pNew;
pNode=pNew;
}
else
{
pNode->m_pNext=pNew;
pNode=pNode->m_pNext;
}
}
return pHead;
}
void printList(ListNode* pHead)
{
ListNode* p=pHead;
while(p!=NULL)
{
cout<<p->m_nValue<<" ";
p=p->m_pNext;
}
cout<<endl;
}
//递归实现 
//注意判断oldList!=NULL的情况 
ListNode *reverse(ListNode *oldList,ListNode *newHead=NULL) 

    if(oldList!=NULL) 
    { 
        ListNode *next=oldList->m_pNext;//记录上次反转后的链表 
        oldList->m_pNext=newHead;//将当前节点插入到翻转后链表的开头 
        newHead=oldList;//递归处理剩余的链表 
        return (next==NULL)?newHead:reverse(next,newHead); 
    } 
    return NULL; 

ListNode *ReverseList(ListNode * pHead)
{
ListNode *pReversedHead=NULL;
ListNode *pNode=pHead;
ListNode *pPrev=NULL;
if(pHead==NULL)
return NULL;
while(pNode!=NULL)
{
ListNode *pNext=pNode->m_pNext; if(pNext==NULL)
pReversedHead=pNode;
pNode->m_pNext=pPrev; pPrev=pNode;
pNode=pNext;
}
return pReversedHead;
}
void main()
{
int a[]={,,,,};
ListNode* pHead=createList(a,);
printList(pHead);
ListNode* pReversedHead=ReverseList(pHead);
printList(pReversedHead);
}

Java代码:

public class ReverseLink {

    public  static class ListNode
{
public int m_nValue;
public ListNode m_pNext;
}
//创建链表
public static ListNode CreateLink(int a[],int k)
{
ListNode Head=null,q=null;
for(int i=;i<k;i++)
{
ListNode pNew=new ListNode();
pNew.m_nValue=a[i];
pNew.m_pNext=null;
if(Head==null)
{
Head=pNew;
q=pNew;
}
else
{
q.m_pNext=pNew;
q=q.m_pNext;
} }
return Head;
}
//从头到尾打印列表
public static void printLink(ListNode pHead)
{
ListNode p=pHead;
while(p != null)
{
System.out.print(p.m_nValue+" ");
p=p.m_pNext;
}
System.out.println("\n");
}
//反转链表
public static ListNode reverseList(ListNode pHead)
{
ListNode pReversedHead=null;
ListNode pNode=pHead;
ListNode pre=null;
if(pHead==null)
return null; while(pNode!=null)
{
ListNode pNext=pNode.m_pNext;
if(pNode.m_pNext==null)
pReversedHead=pNode;
pNode.m_pNext=pre;
pre=pNode;
pNode=pNext;
}
return pReversedHead;
}
public static void main(String[] args) {
int a[]={,,};
ListNode Head=CreateLink(a,);
printLink(Head);
ListNode pReversedHead=reverseList(Head);
printLink(pReversedHead);
} }

剑指offer-第三章高质量代码(反转链表)的更多相关文章

  1. 剑指offer—第三章高质量代码(数值的整数次方)

    高质量的代码:容错处理能力,规范性,完整性.尽量展示代码的可扩展型和可维护性. 容错处理能力:特别的输入和处理,异常,资源回收. 规范性:清晰的书写,清晰的布局,合理的命名. 完整性:功能测试,边界测 ...

  2. 剑指offer—第三章高质量代码(o(1)时间删除链表节点)

    题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点,链表节点与函数的定义如下:struct ListNode{int m_nValue;ListNode* m_pValue ...

  3. 剑指offer—第三章高质量代码(合并两个排序链表)

    题目:输入员两个递增排序的链表,合并这两个链表并使新的链表中的结点仍然是按照递增排序的. 思路:首先,定义两个头节点分别为Head1和Head2的链表,然后比较第一个节点的值,如果是Head1-> ...

  4. 剑指offer—第三章高质量的代码(按顺序打印从1到n位十进制数)

    题目:输入一个数字n,按照顺序打印出1到最大n位十进制数,比如输入3,则打印出1,2,3直到最大的3位数999为止. 本题陷阱:没有考虑到大数的问题. 本题解题思路:将要打印的数字,看成字符串,不足位 ...

  5. 剑指offer第三章

    剑指offer第三章 1.数值的整数次方 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. class Solution { public ...

  6. 【剑指offer】递归循环两种方式反转链表

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/25737023 本文分别用非递归和递归两种方式实现了链表的反转,在九度OJ上AC. 题目描写 ...

  7. 《剑指offer》第二十四题(反转链表)

    // 面试题24:反转链表 // 题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的 // 头结点. #include <iostream> #include &quo ...

  8. 剑指offer-第三章高质量代码(树的子结构)

    题目:输入两个二叉树A和B,判断B是不是A的子结构. 思路:遍历A树找到B树的根节点,然后再判断左右子树是否相同.不相同再往下找.重复改过程. 子结构的描述如下图所示: C++代码: #include ...

  9. 剑指offer——python【第15题】反转链表

    题目描述 翻转一个链表 样例:给出一个链表1->2->3->null,这个翻转后的链表为3->2->1->null 思路 一种比较简单的方法是用“摘除法”.就是先新 ...

随机推荐

  1. apache性能测试工具ab

    性能测试工具目前最常见的有以下几种:ab.http_load.webbench.siege ab是apache自带的压力测试工具.ab非常实用,它不仅可以对apache服务器进行网站访问压力测试,也可 ...

  2. NOIP 关押罪犯

    (prison.pas/c/cpp)[问题描述] S 城现有两座监狱,一共关押着 N 名罪犯,编号分别为 1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发 ...

  3. fabric查看本地与远程主机信息

    #!/usr/bin/pythonfrom fabric.api import *env.user='root'env.hosts=['172.10.224.183','172.10.224.132' ...

  4. 关于YII2中编辑页面全局变量冲突问题

    今天做一编辑页面时被一个很小的问题困了许久.由于在YII2框架里高度集成了bootstrp框架,在做一个编辑的页面时出现了一个自定义的功能,自定义的字段非数据库表里的字段,所以需要在模型里单独声明一个 ...

  5. Windows下搭建Apache+Django+Python Web服务环境

    最近在学Django,想用Apache搭建一个服务器环境,因此在网上看了好多资料,很多都是用Python2.6和Apache2.2搭建的环境,不过我还是想用Python35和Apache24来搭建,具 ...

  6. JDBC插入性能优化对比

    今天对Insert进行了性能测试,结果反差很大,平时都是单条插入,虽然性能要求没有那么高,但是突然在项目中,人家给定时间内完成,这就尴尬了. 优化数据库,优化服务器,优化代码,反正通过各种优化提高数据 ...

  7. Android中获取资源的id和url方法总结

    一,获取android工程里面的各种资源的id; 1.1 string型 比如下面: << string name=”OK”>> 客户端请求成功 << / stri ...

  8. LeetCode第[5]题(Java):Longest Palindromic Substring 标签:String、动态规划

    题目中文:求最长回文子串 题目难度:Medium 题目内容: Given a string s, find the longest palindromic substring in s. You ma ...

  9. BZOJ 1492 [NOI2007]货币兑换Cash:斜率优化dp + cdq分治

    传送门 题意 初始时你有 $ s $ 元,接下来有 $ n $ 天. 在第 $ i $ 天,A券的价值为 $ A[i] $ ,B券的价值为 $ B[i] $ . 在第 $ i $ 天,你可以进行两种操 ...

  10. BZOJ 4726 [POI2017]Sabota?:树形dp

    传送门 题意 某个公司有 $ n $ 个人,上下级关系构成了一个有根树.其中有个人是叛徒(这个人不知道是谁).对于一个人, 如果他下属(直接或者间接, 不包括他自己)中叛徒占的比例超过 $ x $ , ...