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 相关文章推荐
Python 探针的实现原理
Apr 23 Python
利用python实现命令行有道词典的方法示例
Jan 31 Python
一个基于flask的web应用诞生 记录用户账户登录状态(6)
Apr 11 Python
Python2包含中文报错的解决方法
Jul 09 Python
利用python实现对web服务器的目录探测的方法
Feb 26 Python
Python实现时间序列可视化的方法
Aug 06 Python
Django Admin中增加导出CSV功能过程解析
Sep 04 Python
Pyorch之numpy与torch之间相互转换方式
Dec 31 Python
完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误
Apr 01 Python
python 3.8.3 安装配置图文教程
May 21 Python
keras绘制acc和loss曲线图实例
Jun 15 Python
基于OpenCV的网络实时视频流传输的实现
Nov 15 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
推荐文章系统(一)
2006/10/09 PHP
php 3行代码的分页算法(求起始页和结束页)
2009/10/21 PHP
jQuery+PHP发布的内容进行无刷新分页(Fckeditor)
2015/10/22 PHP
php实现登录tplink WR882N获取IP和重启的方法
2016/07/20 PHP
PHP使用DOM和simplexml读取xml文档的方法示例
2017/02/08 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
IE JS编程需注意的内存释放问题
2009/06/23 Javascript
Javascript 浮点运算的问题分析与解决方法
2013/08/27 Javascript
JS 有趣的eval优化输入验证实例代码
2013/09/22 Javascript
js调试系列 控制台命令行API使用方法
2014/06/18 Javascript
dul无法加载bootstrap实现unload table/user恢复
2016/09/29 Javascript
jQuery中用on绑定事件时需注意的事项
2017/03/19 Javascript
JS实现自定义状态栏动画文字效果示例
2017/10/12 Javascript
微信小程序动态生成二维码的实现代码
2018/07/25 Javascript
小程序中设置缓存过期的实现方法
2020/01/14 Javascript
微信小程序自定义顶部组件customHeader的示例代码
2020/06/03 Javascript
[55:54]FNATIC vs EG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
flask中使用SQLAlchemy进行辅助开发的代码
2013/02/10 Python
Python发送form-data请求及拼接form-data内容的方法
2016/03/05 Python
浅析Python中yield关键词的作用与用法
2016/11/29 Python
python 列表,数组,矩阵两两转换tolist()的实例
2018/04/04 Python
Python实现Singleton模式的方式详解
2019/08/08 Python
Python多线程爬取豆瓣影评API接口
2019/10/22 Python
Pytest mark使用实例及原理解析
2020/02/22 Python
Python计算指定日期是今年的第几天(三种方法)
2020/03/26 Python
python使用QQ邮箱实现自动发送邮件
2020/06/22 Python
python 利用opencv实现图像网络传输
2020/11/12 Python
HTML5中微数据概述及在搜索引擎中的使用举例
2013/02/07 HTML / CSS
H5离线存储Manifest原理及使用
2020/04/28 HTML / CSS
英国买鞋网站:Charles Clinkard
2019/11/14 全球购物
数据库连接池的工作原理
2012/09/26 面试题
日期和时间问题
2015/01/04 面试题
小学教师暑期培训方案
2014/08/28 职场文书
村党支部书记四风问题个人对照检查材料思想汇报
2014/10/06 职场文书
部门2014年度工作总结
2014/11/12 职场文书
2015初中教导处工作总结
2015/07/21 职场文书