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和GO语言实现的消息摘要算法示例
Mar 10 Python
Python递归遍历列表及输出的实现方法
May 19 Python
python构建深度神经网络(续)
Mar 10 Python
python监控进程状态,记录重启时间及进程号的实例
Jul 15 Python
python实现两张图片拼接为一张图片并保存
Jul 16 Python
django认证系统实现自定义权限管理的方法
Aug 28 Python
Python3 Tkinkter + SQLite实现登录和注册界面
Nov 19 Python
PyTorch中permute的用法详解
Dec 30 Python
JAVA SWT事件四种写法实例解析
Jun 05 Python
python pymysql链接数据库查询结果转为Dataframe实例
Jun 05 Python
Django Form常用功能及代码示例
Oct 13 Python
Python使用cn2an实现中文数字与阿拉伯数字的相互转换
Mar 02 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 date()函数警告: It is not safe to rely on the system解决方法
2014/08/20 PHP
php实现模拟post请求用法实例
2015/07/11 PHP
你不知道的文件上传漏洞php代码分析
2016/09/29 PHP
JavaScript高级程序设计
2006/12/29 Javascript
javascript 操作select下拉列表框的一点小经验
2010/03/20 Javascript
javascript 正则替换 replace(regExp, function)用法
2010/05/22 Javascript
jQuery实现炫酷的鼠标轨迹特效
2015/02/01 Javascript
jQuery实现简洁的导航菜单效果
2015/11/23 Javascript
jQuery实现图片上传和裁剪插件Croppie
2015/11/29 Javascript
整理Javascript数组学习笔记
2015/11/29 Javascript
总结AngularJS开发者最常犯的十个错误
2016/08/31 Javascript
用JS动态设置CSS样式常见方法小结(推荐)
2016/11/10 Javascript
javaScript生成支持中文带logo的二维码(jquery.qrcode.js)
2017/01/03 Javascript
vux uploader 图片上传组件的安装使用方法
2018/05/15 Javascript
element-ui循环显示radio控件信息的方法
2018/08/24 Javascript
Vue实现浏览器打印功能的代码
2020/04/17 Javascript
使用next.js开发网址缩短服务的方法
2020/06/17 Javascript
Python读写Redis数据库操作示例
2014/03/18 Python
Python基础之函数用法实例详解
2014/09/10 Python
python基于隐马尔可夫模型实现中文拼音输入
2016/04/01 Python
Python数据分析之如何利用pandas查询数据示例代码
2017/09/01 Python
Python IDLE入门简介
2017/12/08 Python
解决python使用open打开文件中文乱码的问题
2017/12/29 Python
谈一谈数组拼接tf.concat()和np.concatenate()的区别
2020/02/07 Python
Python如何输出整数
2020/06/07 Python
python利用递归方法实现求集合的幂集
2020/09/07 Python
Canvas引入跨域的图片导致toDataURL()报错的问题的解决
2018/09/19 HTML / CSS
"火柴棍式"程序员面试题
2014/03/16 面试题
数组越界问题
2015/10/21 面试题
调解员先进事迹材料
2014/02/07 职场文书
法制报告会主持词
2014/04/02 职场文书
关于读书的演讲稿800字
2014/08/27 职场文书
计划生育工作总结2015
2015/04/03 职场文书
2015年中学图书馆工作总结
2015/07/22 职场文书
二年级数学教学反思
2016/02/16 职场文书
详解TypeScript中的类型保护
2021/04/29 Javascript