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;
//
返回当前节点
}
这个方法是采用了递归算法,也就是在反转当前节点之前先反转其后继节点,说白了其实就是利用函数的调用堆栈构建了一个临时链表罢了,挺废的一个算法,权当作是写着好玩,没有什么实在的意义。
采用此算法需要注意的是,头结点必须要传入的是引用,因为在递归跳出的时候要切断链表,否则链表将会形成一个回环。
----夫英雄者,胸怀大志,腹有良谋,有包藏宇宙之机,吞吐天地之志者也。
查看全文
相关阅读:
冒泡排序
题6 字典转数组 修改 大美女
题5数组 排序 修改 字典以字符串输出
题4数组 删除 排序
数组字典结合删除排序 描述器
盘点世界上最怪异的编程语言: 这6种编程语言的出现,只是为了好玩?
Linux“四”种软件包都安排上了!详细安装过程曝光
又一名程序员被判刑了!百度92年程序员改当“审核员”,编写脚本违规“开绿灯”
C++的三种继承方式:public,protected,private
Linux下查询进程占用内存的5种方式!还有谁不会?
原文地址:https://www.cnblogs.com/eagleking0318/p/6521226.html
最新文章
关于vue中滚动监听失效问题
滚动监听
vue路由拦截
移动端手机适配
雪碧图使用
前端基于axios封装api
vue 音频问题
游戏项目技术总结
vue 路径问题
程序员生活点滴
热门文章
Object-C 杂乱笔记
【Android基础】页面跳转与传值(Activity跳转与传值)
Android 按钮设置边框实例
解决Android工程里的xml文件自动提示问题
巧用位移运算符获取汉字编码值
常见算法的实际应用
排序
IOS小应用学习
使用git上传文件到github
单链表
Copyright © 2011-2022 走看看