剑指offer-第三章高质量代码(反转链表)
题目:定义一个函数,输入一个链表的头节点,反转该链表并输出反转链表的头节点。
思路:对一个链表反转需要三个指针操作来保证链表在反转的过程中保证不断链,给链表一个行动指针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-第三章高质量代码(反转链表)的更多相关文章
- 剑指offer—第三章高质量代码(数值的整数次方)
高质量的代码:容错处理能力,规范性,完整性.尽量展示代码的可扩展型和可维护性. 容错处理能力:特别的输入和处理,异常,资源回收. 规范性:清晰的书写,清晰的布局,合理的命名. 完整性:功能测试,边界测 ...
- 剑指offer—第三章高质量代码(o(1)时间删除链表节点)
题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点,链表节点与函数的定义如下:struct ListNode{int m_nValue;ListNode* m_pValue ...
- 剑指offer—第三章高质量代码(合并两个排序链表)
题目:输入员两个递增排序的链表,合并这两个链表并使新的链表中的结点仍然是按照递增排序的. 思路:首先,定义两个头节点分别为Head1和Head2的链表,然后比较第一个节点的值,如果是Head1-> ...
- 剑指offer—第三章高质量的代码(按顺序打印从1到n位十进制数)
题目:输入一个数字n,按照顺序打印出1到最大n位十进制数,比如输入3,则打印出1,2,3直到最大的3位数999为止. 本题陷阱:没有考虑到大数的问题. 本题解题思路:将要打印的数字,看成字符串,不足位 ...
- 剑指offer第三章
剑指offer第三章 1.数值的整数次方 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. class Solution { public ...
- 【剑指offer】递归循环两种方式反转链表
转载请注明出处:http://blog.csdn.net/ns_code/article/details/25737023 本文分别用非递归和递归两种方式实现了链表的反转,在九度OJ上AC. 题目描写 ...
- 《剑指offer》第二十四题(反转链表)
// 面试题24:反转链表 // 题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的 // 头结点. #include <iostream> #include &quo ...
- 剑指offer-第三章高质量代码(树的子结构)
题目:输入两个二叉树A和B,判断B是不是A的子结构. 思路:遍历A树找到B树的根节点,然后再判断左右子树是否相同.不相同再往下找.重复改过程. 子结构的描述如下图所示: C++代码: #include ...
- 剑指offer——python【第15题】反转链表
题目描述 翻转一个链表 样例:给出一个链表1->2->3->null,这个翻转后的链表为3->2->1->null 思路 一种比较简单的方法是用“摘除法”.就是先新 ...
随机推荐
- dbml 注意事项
1,修改dbml中的字段,需要修改2个地方
- ReadyBoost
ReadyBoost是Windows Vista中的新技术,在继Windows Vista的下一代操作系统Windows 7中,同样包含了这项技术,它利用了闪存随机读写及零碎文档读写上的优势来提高计算 ...
- 如何用纯 CSS 创作一个小球上台阶的动画
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/PBGJwL 可交互视频 ...
- 20145201 《Java程序设计》第四周学习总结
20145201 <Java程序设计>第四周学习总结 教材学习内容总结 本周学习了课本第六.七章内容,即继承与多态.接口与多态. 第六章 继承与多态 6.1 何谓继承 6.1.1 继承共同 ...
- String创建方式的区别
String str0 = "abc"; String str1 = new String("abc"); 第一句执行后,会在String pool中创建一个& ...
- 20145235李涛《网络对抗》Exp7 网络欺诈技术防范
基础问题回答 通常在什么场景下容易受到DNS spoof攻击? 使用未知的公共wifi或者在不安全的局域网下容易受到DNS spoof攻击. 在日常生活工作中如何防范以上两攻击方法? 首先要提高防范意 ...
- Apache配置的5个技巧
AcceptMutex Apache 1.3.21和Apache 2.0中引入了AcceptMutex 指示符,该指示符给调节服务器的性能带来了一个难得的机会.该指示符配置Apache的accept( ...
- postgre数据库插入错误:prepared statement “S_1”already exist, 解决办法
在使用kettle工具(数据迁移软件)在postgre数据库中插入记录时,出现如下错误,解决办法: 在/etc/pgsql/pgbouncer.ini中修改配置,设置 server_reset_que ...
- 你知道uwsgi???
第一步,打开https://www.google.com.hk 第二步,输入how to restart uwsgi
- Codeforces Round #423 (Div. 1, rated, based on VK Cup Finals)
Codeforces Round #423 (Div. 1, rated, based on VK Cup Finals) A.String Reconstruction B. High Load C ...