Python实现链表反转的方法分析【迭代法与递归法】


Posted in Python onFebruary 22, 2020

本文实例讲述了Python实现链表反转的方法。分享给大家供大家参考,具体如下:

Python实现链表反转

链表反转(while迭代实现):

  • 链表的反转引入一个cur_node变量,表示当前节点;同时需要引入一个变量new_link表示反转后的新链表;while循环内还需中间变量tmp存放当前节点的后继节点,防止原链表数据丢失。
  • 在while循环内(循环条件为 cur_node !=None,若设置为cur_node.next将导致最后一个节点无法反转到新链表):
    • 首先需要将当前节点的后继节点传递给中间变量tmp
    • 当前节点指向新链表new_link
    • 当前节点指向新链表new_link后,新链表头结点更新为当前节点cur_node
    • 将中间变量tmp传递给cur_node,开始新一轮循环
    • 循环结束后返回 new_link
class Node(object):
  def __init__(self, value=None, next=None):
    self.value = value
    self.next = next

  @staticmethod
  def reverse(head):
    cur_node = head # 当前节点
    new_link = None # 表示反转后的链表
    while cur_node != None:
      tmp = cur_node.next # cur_node后续节点传递给中间变量
      cur_node.next = new_link  # cur_node指向new_link
      new_link = cur_node  # 反转链表更新,cur_node为新的头结点
      cur_node = tmp  # 原链表节点后移一位
    return new_link

link = Node(1, Node(2, Node(3, Node(4, Node(5, Node(6, Node(7, Node(8, Node(9)))))))))
root = Node.reverse(link)
while root:
    print(root.value)
    root =root.next

运行结果:

9
8
7
6
5
4
3
2
1

递归实现:

  • 递归实现与while实现不同在于递归首先找到新链表的头部节点,然后递归栈返回,层层反转
  • 首先找到新链表的头结点(即遍历到原链表的最后一个节点返回最后节点)
  • 执行函数体后续代码,将原链表中的尾节点指向原尾节点的前置节点
  • 前置节点的指针指向None(防止出现死循环)
  • 返回新链表的头部节点至上一层函数,重复以上操作
def reverse2(head):
    if head.next == None: # 递归停止的基线条件
      return head
    new_head = reverse2(head.next)
    head.next.next = head # 当前层函数的head节点的后续节点指向当前head节点
    head.next = None # 当前head节点指向None
    return new_head

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
对python .txt文件读取及数据处理方法总结
Apr 23 Python
django的登录注册系统的示例代码
May 14 Python
python 获取一个值在某个区间的指定倍数的值方法
Nov 12 Python
详解pandas使用drop_duplicates去除DataFrame重复项参数
Aug 01 Python
python 回溯法模板详解
Feb 26 Python
python实现简单井字棋游戏
Mar 04 Python
tensorflow使用CNN分析mnist手写体数字数据集
Jun 17 Python
Python爬虫抓取论坛关键字过程解析
Oct 19 Python
Python Socket多线程并发原理及实现
Dec 11 Python
Python使用Opencv实现边缘检测以及轮廓检测的实现
Dec 31 Python
python使用matplotlib绘制图片时x轴的刻度处理
Aug 30 Python
Python中的协程(Coroutine)操作模块(greenlet、gevent)
May 30 Python
Python实现队列的方法示例小结【数组,链表】
Feb 22 #Python
python实现从尾到头打印单链表操作示例
Feb 22 #Python
python实现滑雪游戏
Feb 22 #Python
Python实现栈的方法详解【基于数组和单链表两种方法】
Feb 22 #Python
Python栈的实现方法示例【列表、单链表】
Feb 22 #Python
python实现滑雪者小游戏
Feb 22 #Python
python实现拼图小游戏
Feb 22 #Python
You might like
全国FM电台频率大全 - 7 吉林省
2020/03/11 无线电
PHP中改变图片的尺寸大小的代码
2011/07/17 PHP
php设计模式之单例、多例设计模式的应用分析
2013/06/30 PHP
win10 apache配置虚拟主机后localhost无法使用的解决方法
2018/01/27 PHP
Yii2框架类自动加载机制实例分析
2018/05/02 PHP
PHP实现的抓取小说网站内容功能示例
2019/06/27 PHP
PHP连接MySQL数据库的三种方式实例分析【mysql、mysqli、pdo】
2019/11/04 PHP
range 标准化之获取
2011/08/28 Javascript
JavaScript面向对象知识串结(读JavaScript高级程序设计(第三版))
2012/07/17 Javascript
JQuery EasyUI 加载两次url的原因分析及解决方案
2014/08/18 Javascript
封装好的一个万能检测表单的方法
2015/01/21 Javascript
javascript实现俄罗斯方块游戏的思路和方法
2015/04/27 Javascript
详解页面滚动值scrollTop在FireFox与Chrome浏览器间的兼容问题
2015/12/03 Javascript
使用bootstrap validator的remote验证代码经验分享(推荐)
2016/09/21 Javascript
vue插件tab选项卡使用小结
2016/10/27 Javascript
JavaScript基于DOM操作实现简单的数学运算功能示例
2017/01/16 Javascript
javascript中json基础知识详解
2017/01/19 Javascript
JavaScript实现随机五位数验证码
2019/09/27 Javascript
如何利用 JS 脚本实现网页全自动秒杀抢购功能
2020/10/12 Javascript
[06:44]2014DOTA2国际邀请赛-钥匙体育馆开战 开幕式振奋人心
2014/07/19 DOTA
[44:40]2018DOTA2亚洲邀请赛3月30日 小组赛A组Liquid VS OG
2018/03/31 DOTA
python黑魔法之参数传递
2016/02/12 Python
python判断设备是否联网的方法
2018/06/29 Python
keras处理欠拟合和过拟合的实例讲解
2020/05/25 Python
在Keras中CNN联合LSTM进行分类实例
2020/06/29 Python
django form和field具体方法和属性说明
2020/07/09 Python
Python 如何操作 SQLite 数据库
2020/08/17 Python
某公司部分笔试题
2013/11/05 面试题
关于赌博的检讨书
2014/01/08 职场文书
村官学习十八大感想
2014/01/15 职场文书
餐饮企业总经理岗位职责范文
2014/02/18 职场文书
优秀德育工作者事迹材料
2014/05/07 职场文书
高效课堂标语
2014/06/26 职场文书
学习与创新自我评价
2015/03/09 职场文书
2015年医院创卫工作总结
2015/04/22 职场文书
Redis Stream类型的使用详解
2021/11/11 Redis