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中用startswith()函数判断字符串开头的教程
Apr 07 Python
python实现在windows下操作word的方法
Apr 28 Python
实例讲解Python中global语句下全局变量的值的修改
Jun 16 Python
Python2实现的图片文本识别功能详解
Jul 11 Python
对pandas读取中文unicode的csv和添加行标题的方法详解
Dec 12 Python
python 实现UTC时间加减的方法
Dec 31 Python
使用python3实现操作串口详解
Jan 01 Python
浅谈django url请求与数据库连接池的共享问题
Aug 29 Python
Python中常见的数制转换有哪些
May 27 Python
了解一下python内建模块collections
Sep 07 Python
Python实现曲线拟合的最小二乘法
Feb 19 Python
Python编程中内置的NotImplemented类型的用法
Mar 23 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
PHP连接MySQL的2种方法小结以及防止乱码
2014/03/11 PHP
php自动识别文件编码并转换为UTF-8的方法
2014/06/12 PHP
php实现模拟登陆方正教务系统抓取课表
2015/05/19 PHP
又十个超级有用的PHP代码片段
2015/09/24 PHP
session 加入redis的实现代码
2016/07/15 PHP
去除链接虚线全面分析总结
2006/08/15 Javascript
ExtJs之带图片的下拉列表框插件
2010/03/04 Javascript
firefox火狐浏览器与与ie兼容的2个问题总结
2010/07/20 Javascript
jquery的ajax()函数传值中文乱码解决方法介绍
2012/11/08 Javascript
javascript设计模式--策略模式之输入验证
2015/11/27 Javascript
浅析javascript异步执行函数导致的变量变化问题解决思路
2016/05/13 Javascript
JS实现漂亮的时间选择框效果
2016/08/20 Javascript
jQuery选择器之子元素选择器详解
2017/09/18 jQuery
帝国cms首页列表页实现点赞功能
2017/10/30 Javascript
vue cli升级webapck4总结
2018/04/04 Javascript
vue项目中使用fetch的实现方法
2019/04/25 Javascript
node.js实现带进度条的多文件上传
2020/03/27 Javascript
Node.js API详解之 V8模块用法实例分析
2020/06/05 Javascript
浅析Windows 嵌入python解释器的过程
2019/07/26 Python
python实现的自动发送消息功能详解
2019/08/15 Python
Django框架HttpRequest对象用法实例分析
2019/11/01 Python
Opencv 图片的OCR识别的实战示例
2021/03/02 Python
css3中用animation的steps属性制作帧动画
2019/04/25 HTML / CSS
把富文本的回车转为br标签
2019/08/09 HTML / CSS
HTML5 Canvas绘制圆点虚线实例
2015/01/01 HTML / CSS
土木工程应届生求职信
2013/10/31 职场文书
毕业生怎样写好自荐信
2013/11/11 职场文书
大学活动策划书范文
2014/01/10 职场文书
教导主任竞聘演讲稿
2014/05/16 职场文书
2014年售票员工作总结
2014/11/19 职场文书
领导参观欢迎词
2015/01/26 职场文书
经理聘任证明
2015/03/02 职场文书
增值税发票丢失证明
2015/06/19 职场文书
Python3 使用pip安装git并获取Yahoo金融数据的操作
2021/04/08 Python
python字符串的多行输出的实例详解
2021/06/08 Python
java Nio使用NioSocket客户端与服务端交互实现方式
2021/06/15 Java/Android