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完成FizzBuzzWhizz问题(拉勾网面试题)示例
May 05 Python
python k-近邻算法实例分享
Jun 11 Python
使用Python简单的实现树莓派的WEB控制
Feb 18 Python
python图片验证码生成代码
Jul 02 Python
python中的句柄操作的方法示例
Jun 20 Python
python绘制双Y轴折线图以及单Y轴双变量柱状图的实例
Jul 08 Python
pytorch制作自己的LMDB数据操作示例
Dec 18 Python
python Canny边缘检测算法的实现
Apr 24 Python
快速解释如何使用pandas的inplace参数的使用
Jul 23 Python
Python3+PyCharm+Django+Django REST framework配置与简单开发教程
Feb 16 Python
Django实现在线无水印抖音视频下载(附源码及地址)
May 06 Python
python疲劳驾驶困倦低头检测功能的实现
Apr 04 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
Netflix将与CLAMP、乙一以及冲方丁等6名知名制作人合伙展开原创动画计划!
2020/03/06 日漫
ASP知识讲座四
2006/10/09 PHP
我的论坛源代码(二)
2006/10/09 PHP
利用Memcached在php下实现session机制 替换PHP的原生session支持
2010/08/21 PHP
真正根据utf8编码的规律来进行截取字符串的函数(utf8版sub_str )
2012/10/24 PHP
浅谈Laravel中的一个后期静态绑定
2017/08/11 PHP
PHP Class SoapClient not found解决方法
2018/01/20 PHP
JQuery select标签操作代码段
2010/05/16 Javascript
jquery.boxy插件的iframe扩展代码
2010/07/02 Javascript
JavaScript 函数replace深入了解
2013/03/14 Javascript
JSF中confirm弹出框的用法示例介绍
2014/01/07 Javascript
ie9 提示'console' 未定义问题的解决方法
2014/03/20 Javascript
jquery实现TAB选项卡鼠标经过带延迟效果的方法
2015/07/27 Javascript
JavaScript 拖拽实例代码
2016/09/21 Javascript
vue mixins组件复用的几种方式(小结)
2017/09/06 Javascript
JS实现验证码倒计时的注册页面
2018/01/02 Javascript
Vue.js组件props数据验证实现详解
2019/10/19 Javascript
vue实现表单未编辑或未保存离开弹窗提示功能
2020/04/08 Javascript
vue打包通过image-webpack-loader插件对图片压缩优化操作
2020/11/12 Javascript
[47:20]DAC2018 4.4 淘汰赛 Optic vs Mineski 第一场
2018/04/05 DOTA
python+pygame简单画板实现代码实例
2017/12/13 Python
Python实现针对给定字符串寻找最长非重复子串的方法
2018/04/21 Python
Python实现迭代时使用索引的方法示例
2018/06/05 Python
利用Tensorflow构建和训练自己的CNN来做简单的验证码识别方式
2020/01/20 Python
python使用PIL剪切和拼接图片
2020/03/23 Python
在脚本中单独使用django的ORM模型详解
2020/04/01 Python
浅谈pymysql查询语句中带有in时传递参数的问题
2020/06/05 Python
Python 实现将numpy中的nan和inf,nan替换成对应的均值
2020/06/08 Python
奥地利网上现代灯具和灯饰店:Lampenwelt.at
2018/01/29 全球购物
澳大利亚Rockwear官网:女子瑜伽、健身和运动服
2021/01/26 全球购物
内部类的定义、种类以及优点
2013/10/16 面试题
工程招投标邀请书
2014/01/26 职场文书
教师个人自我鉴定
2014/02/08 职场文书
离婚协议书怎么写的
2014/12/14 职场文书
如何使用Python实现一个简易的ORM模型
2021/05/12 Python
动作冒险《Hell Is Us》将采用虚幻5 消灭怪物探索王国
2022/04/13 其他游戏