zoukankan
html css js c++ java
单向链表反转
题目:
已知单向链表的头结点head,写一个函数把这个链表逆序 ( Intel)
解答:
我们假设单向链表的节点如下:
template
<
typename
T
>
class
list_node
{
public
:
list_node
*
next;
T
data;
}
;
这个题目算是考察数据结构的最基础的题目了,有两种方法可以解此题:
方法一:
void
reverse(node
*&
head)
{
if
(
(head
==
0
)
||
(head
->
next
==
0
)
)
return
;
//
边界检测
node
*
pNext
=
0
;
node
*
pPrev
=
head;
//
保存链表头节点
node
*
pCur
=
head
->
next;
//
获取当前节点
while
(pCur
!=
0
)
{
pNext
=
pCur
->
next;
//
将下一个节点保存下来
pCur
->
next
=
pPrev;
//
将当前节点的下一节点置为前节点
pPrev
=
pCur;
//
将当前节点保存为前一节点
pCur
=
pNext;
//
将当前节点置为下一节点
}
head->next=pPrev;
}
这是一般的方法,总之就是用了几个临时变量,然后遍历整个链表,将当前节点的下一节点置为前节点。
方法二:
node
*
reverse(
node
*
pNode,
node
*&
head)
{
if
(
(pNode
==
0
)
||
(pNode
->
next
==
0
)
)
//
递归跳出条件
{
head
=
pNode;
//
将链表切断,否则会形成回环
return
pNode;
}
node
*
temp
=
reserve(pNode
->
next,
head);
//
递归
temp
->
next
=
pNode;
//
将下一节点置为当前节点,既前置节点
return
pNode;
//
返回当前节点
}
这个方法是采用了递归算法,也就是在反转当前节点之前先反转其后继节点,说白了其实就是利用函数的调用堆栈构建了一个临时链表罢了,挺废的一个算法,权当作是写着好玩,没有什么实在的意义。
采用此算法需要注意的是,头结点必须要传入的是引用,因为在递归跳出的时候要切断链表,否则链表将会形成一个回环。
----夫英雄者,胸怀大志,腹有良谋,有包藏宇宙之机,吞吐天地之志者也。
查看全文
相关阅读:
模板:高精度求积
模板:求n累加和
模板:求A/B高精度值
模板:堆
模板:素数筛
模板:前缀和
模板:单调队列(Sliding Window)
模板:最长上升子序列(LIS)
[转]Asp.net mvc 网站之速度优化 -- 页面缓存
[转]ASP.NET MVC3 + EF 性能优化解决方案以及最优架构
原文地址:https://www.cnblogs.com/eagleking0318/p/6521226.html
最新文章
CSS 技术关键字
学习zepto.js(原型方法)
< meta > 元素 概要
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
javascript 常用函数
Less函数说明
less入门
sass、less和stylus的安装使用和入门实践
编译SASS
windows driver 简单的驱动和通信
热门文章
Flutter Navigator2.0
js 检测浏览器开发者控制台是否被打开
js 动态构建style
js form.onformData事件
js IdleDetector 检测用户是否处于活动状态API
js navigator.wakeLock 保持屏幕唤醒状态
flutter 使用Android studio编辑kt插件
js showOpenFilePicker showSaveFilePicker showDirectoryPicker API
食物链(并查集)
NOIP 2010 关押罪犯(并查集)
Copyright © 2011-2022 走看看