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列表操作之extend和append的区别实例分析
Jul 28 Python
python框架django基础指南
Sep 08 Python
python3.6连接MySQL和表的创建与删除实例代码
Dec 28 Python
python程序控制NAO机器人行走
Apr 29 Python
Python用Try语句捕获异常的实例方法
Jun 26 Python
python pytest进阶之xunit fixture详解
Jun 27 Python
python读取tif图片时保留其16bit的编码格式实例
Jan 13 Python
keras模型可视化,层可视化及kernel可视化实例
Jan 24 Python
Django中从mysql数据库中获取数据传到echarts方式
Apr 07 Python
TensorFlow中如何确定张量的形状实例
Jun 23 Python
Ubuntu20.04环境安装tensorflow2的方法步骤
Jan 29 Python
Python爬虫爬取微博热搜保存为 Markdown 文件的源码
Feb 22 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 设计模式之 单例模式
2008/12/19 PHP
ThinkPHP框架分布式数据库连接方法详解
2017/03/14 PHP
PHP下载远程图片的几种方法总结
2017/04/07 PHP
页面只有一个text的时候,回车自动submit的解决方法
2010/08/12 Javascript
js和jquery对dom节点的操作(创建/追加)
2013/04/21 Javascript
JavaScript实现存储HTML字符串示例
2014/04/21 Javascript
js在数组中删除重复的元素自保留一个(两种实现思路)
2014/08/22 Javascript
jQuery学习笔记之2个小技巧
2015/01/19 Javascript
js判断是否按下了Shift键的方法
2015/01/27 Javascript
JavaScript实现数组在指定位置插入若干元素的方法
2015/04/06 Javascript
基于javascript简单实现对身份证校验
2021/01/25 Javascript
url中的特殊符号有什么含义(推荐)
2016/06/17 Javascript
Vue.js第四天学习笔记
2016/12/02 Javascript
PHP实现记录代码运行时间封装类实例教程
2017/05/08 Javascript
JS散列表碰撞处理、开链法、HashTable散列示例
2019/02/08 Javascript
微信小程序实现的一键复制功能示例
2019/04/24 Javascript
微信小程序wx.request拦截器使用详解
2019/07/09 Javascript
Jquery如何使用animation动画效果改变背景色的代码
2020/07/20 jQuery
如何实现小程序与小程序之间的跳转
2020/11/04 Javascript
swiper实现导航滚动效果
2020/12/13 Javascript
从源码角度来回答keep-alive组件的缓存原理
2021/01/18 Javascript
[57:47]Fnatic vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python实例分享:快速查找出被挂马的文件
2014/06/08 Python
Python中subprocess的简单使用示例
2015/07/28 Python
在arcgis使用python脚本进行字段计算时是如何解决中文问题的
2015/10/18 Python
Python2和Python3.6环境解决共存问题
2018/11/09 Python
新建文件时Pycharm中自动设置头部模板信息的方法
2020/04/17 Python
QML用PathView实现轮播图
2020/06/03 Python
keras 模型参数,模型保存,中间结果输出操作
2020/07/06 Python
轻松掌握CSS3中的字体大小单位rem的使用方法
2016/05/24 HTML / CSS
给同学的道歉信
2014/01/16 职场文书
小露珠教学反思
2014/04/30 职场文书
售后服务承诺书怎么写
2014/05/21 职场文书
学生抄作业检讨书(2篇)
2014/10/17 职场文书
四风问题专项整治工作情况报告
2014/10/28 职场文书
SONY AN-LP1 短波有源天线放大器图
2022/04/05 无线电