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 相关文章推荐
Django中针对基于类的视图添加csrf_exempt实例代码
Feb 11 Python
利用Python写一个爬妹子的爬虫
Jun 08 Python
Python迭代器与生成器基本用法分析
Jul 26 Python
python文件操作之批量修改文件后缀名的方法
Aug 10 Python
Python实现简单层次聚类算法以及可视化
Mar 18 Python
Python opencv实现人眼/人脸识别以及实时打码处理
Apr 29 Python
python实现自动化报表功能(Oracle/plsql/Excel/多线程)
Dec 02 Python
python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例
Apr 02 Python
如何使用python记录室友的抖音在线时间
Jun 29 Python
利用Python实现斐波那契数列的方法实例
Jul 26 Python
Pycharm 2020.1 版配置优化的详细教程
Aug 07 Python
python 用Matplotlib作图中有多个Y轴
Nov 28 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
URL Rewrite的设置方法
2007/01/02 PHP
既简单又安全的PHP验证码 附调用方法
2016/06/02 PHP
jquery中常用的SET和GET
2009/01/13 Javascript
关于jquery动态增减控件的一些想法和小插件
2010/08/01 Javascript
Javascript中的window.event.keyCode使用介绍
2011/04/26 Javascript
基于jQuery.Validate验证库知识点的详解
2013/04/26 Javascript
js日期相关函数总结分享
2013/10/15 Javascript
5个JavaScript经典面试题
2014/10/13 Javascript
一个JavaScript递归实现反转数组字符串的实例
2014/10/14 Javascript
JavaScript数据结构和算法之图和图算法
2015/02/11 Javascript
网页禁用右键菜单和鼠标拖动选择方法小结
2015/02/25 Javascript
Node.js简单入门前传
2017/08/21 Javascript
vue-router路由与页面间导航实例解析
2017/11/07 Javascript
解决angular2在双向数据绑定时[(ngModel)]无法使用的问题
2018/09/13 Javascript
nuxt中使用路由守卫的方法步骤
2019/01/27 Javascript
小程序实现层叠卡片滑动效果
2019/08/26 Javascript
解决Nuxt使用axios跨域问题
2020/07/06 Javascript
[48:54]VGJ.T vs infamous Supermajor小组赛D组败者组第一轮 BO3 第二场 6.3
2018/06/04 DOTA
python打开网页和暂停实例
2014/09/30 Python
Python实现模拟登录网易邮箱的方法示例
2018/07/05 Python
你应该知道的30个css选择器
2014/03/19 HTML / CSS
全球速卖通俄罗斯站:AliExpress俄罗斯
2019/06/17 全球购物
物流仓储实习自我鉴定
2013/09/25 职场文书
护士自我鉴定
2013/10/23 职场文书
大学专科生推荐信范文
2013/11/23 职场文书
医院总经理职责
2013/12/26 职场文书
吨的认识教学反思
2014/04/27 职场文书
公司捐款倡议书
2014/05/14 职场文书
国庆65周年演讲稿:回首往昔,展望未来
2014/09/21 职场文书
不服劳动仲裁起诉书
2015/05/20 职场文书
婚礼嘉宾致辞
2015/07/28 职场文书
2016年读书月活动总结范文
2016/04/06 职场文书
2019公司借款合同范本2篇!
2019/07/24 职场文书
Nginx域名转发https访问的实现
2021/03/31 Servers
PyTorch 如何设置随机数种子使结果可复现
2021/05/12 Python
golang 语言中错误处理机制
2021/08/30 Golang