python算法题 链表反转详解


Posted in Python onJuly 02, 2019

链表的反转是一个很常见、很基础的数据结构题,输入一个单向链表,输出逆序反转后的链表,如图:上面的链表转换成下面的链表。实现链表反转有两种方式,一种是循环迭代,另外一种方式是递归。

python算法题 链表反转详解

第一种方式:循坏迭代

循坏迭代算法需要三个临时变量:pre、head、next,临界条件是链表为None或者链表就只有一个节点。

# encoding: utf-8
class Node(object):
def __init__(self):
self.value = None
self.next = None
def __str__(self):
return str(self.value)
def reverse_loop(head):
if not head or not head.next:
return head
pre = None 
while head:
next = head.next # 缓存当前节点的向后指针,待下次迭代用
head.next = pre # 这一步是反转的关键,相当于把当前的向前指针作为当前节点的向后指针
pre = head # 作为下次迭代时的(当前节点的)向前指针
head = next # 作为下次迭代时的(当前)节点
return pre # 返回头指针,头指针就是迭代到最后一次时的head变量(赋值给了pre)

测试一下:

if __name__ == '__main__':
three = Node()
three.value = 3
two = Node()
two.value = 2
two.next = three
one = Node()
one.value = 1
one.next = two
head = Node()
head.value = 0
head.next = one
newhead = reverse_loop(head)
while newhead:
print(newhead.value, )
newhead = newhead.next

输出:

3
2
1
0
2

python算法题 链表反转详解

第二种方式:递归

递归的思想就是:

head.next = None
head.next.next = head.next
head.next.next.next = head.next.next
...
...

head的向后指针的向后指针转换成head的向后指针,依此类推。

实现的关键步骤就是找到临界点,何时退出递归。当head.next为None时,说明已经是最后一个节点了,此时不再递归调用。

def reverse_recursion(head):
if not head or not head.next:
return head
new_head = reverse_recursion(head.next)
head.next.next = head
head.next = None
return new_head

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
在Windows8上的搭建Python和Django环境
Jul 03 Python
详解Python中time()方法的使用的教程
May 22 Python
python中利用xml.dom模块解析xml的方法教程
May 24 Python
Python中str.join()简单用法示例
Mar 20 Python
PyCharm+PySpark远程调试的环境配置的方法
Nov 29 Python
python挖矿算力测试程序详解
Jul 03 Python
python打印异常信息的两种实现方式
Dec 24 Python
python时间与Unix时间戳相互转换方法详解
Feb 13 Python
解决ROC曲线画出来只有一个点的问题
Feb 28 Python
完美解决keras保存好的model不能成功加载问题
Jun 11 Python
Python实现AES加密,解密的两种方法
Oct 03 Python
pytorch查看网络参数显存占用量等操作
May 12 Python
python输入多行字符串的方法总结
Jul 02 #Python
Django高级编程之自定义Field实现多语言
Jul 02 #Python
python 杀死自身进程的实现方法
Jul 01 #Python
python 判断linux进程,并杀死进程的实现方法
Jul 01 #Python
PyCharm-错误-找不到指定文件python.exe的解决方法
Jul 01 #Python
解决pycharm 工具栏Tool中找不到Run manager.py Task的问题
Jul 01 #Python
简单了解python中对象的取反运算符
Jul 01 #Python
You might like
浅析php fwrite写入txt文件的时候用 \r\n不能换行的问题
2013/08/06 PHP
php使用gzip压缩传输js和css文件的方法
2015/07/29 PHP
CI分页类首页、尾页不显示的解决方法
2016/03/28 PHP
Jquery异步请求数据实例代码
2011/12/28 Javascript
Javascript自定义排序 node运行 实例
2013/06/05 Javascript
父元素与子iframe相互获取变量和元素对象的具体实现
2013/10/15 Javascript
本人自用的global.js库源码分享
2015/02/28 Javascript
javascript中eval和with用法实例总结
2015/11/30 Javascript
Javascript6中字符串的四个新用法分享
2016/09/11 Javascript
Angular2.0/4.0 使用Echarts图表的示例代码
2017/12/07 Javascript
微信小程序实现图片上传功能实例(前端+PHP后端)
2018/01/10 Javascript
vue toggle做一个点击切换class(实例讲解)
2018/03/13 Javascript
详解微信小程序开发用户授权登陆
2019/04/24 Javascript
微信公众号中的JSSDK接入及invalid signature等常见错误问题分析(全面解析)
2020/04/11 Javascript
CentOS 6.5下安装Python 3.5.2(与Python2并存)
2017/06/05 Python
python字符串过滤性能比较5种方法
2017/06/22 Python
python将txt文件读入为np.array的方法
2018/10/30 Python
Python日期时间Time模块实例详解
2019/04/15 Python
python tools实现视频的每一帧提取并保存
2020/03/20 Python
python cv2读取rtsp实时码流按时生成连续视频文件方式
2019/12/25 Python
深入了解如何基于Python读写Kafka
2019/12/31 Python
PyQt5 控件字体样式等设置的实现
2020/05/13 Python
浅谈python处理json和redis hash的坑
2020/07/16 Python
基于Python pyecharts实现多种图例代码解析
2020/08/10 Python
pandas map(),apply(),applymap()区别解析
2021/02/24 Python
CSS3中的content属性使用示例
2015/07/20 HTML / CSS
借助HTML5 Canvas来绘制三角形和矩形等多边形的方法
2016/03/14 HTML / CSS
HTML5拖拽文件上传的示例代码
2021/03/04 HTML / CSS
BLACKMORES澳洲官网:澳大利亚排名第一的保健品牌
2018/09/27 全球购物
自行车租赁公司创业计划书
2014/01/28 职场文书
电大毕业自我鉴定
2014/02/03 职场文书
中国梦口号
2014/06/13 职场文书
酒店工程部主管岗位职责
2015/04/16 职场文书
户外亲子活动总结
2015/05/08 职场文书
交通安全宣传标语(100条)
2019/08/22 职场文书
MySQL基础(一)
2021/04/05 MySQL