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数据结构与算法之图的基本实现及迭代器实例详解
Dec 12 Python
Python获取指定文件夹下的文件名的方法
Feb 06 Python
PyQt5每天必学之滑块控件QSlider
Apr 20 Python
Python 3.3实现计算两个日期间隔秒数/天数的方法示例
Jan 07 Python
matplotlib.pyplot绘图显示控制方法
Jan 15 Python
简单了解python中的与或非运算
Sep 18 Python
Python如何基于rsa模块实现非对称加密与解密
Jan 03 Python
python pandas利用fillna方法实现部分自动填充功能
Mar 16 Python
Python Matplotlib简易教程(小白教程)
Jul 28 Python
Django celery异步任务实现代码示例
Nov 26 Python
Pycharm 跳转回之前所在页面的操作
Feb 05 Python
在 Python 中利用 Pool 进行多线程
Apr 24 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
广播爱好者需要了解的天线知识
2021/03/01 无线电
php守护进程 加linux命令nohup实现任务每秒执行一次
2011/07/04 PHP
yii框架redis结合php实现秒杀效果(实例代码)
2017/10/26 PHP
JS 分号引起的一段调试问题
2009/06/18 Javascript
js最简单的拖拽效果实现代码
2010/09/24 Javascript
JSONP 跨域共享信息
2012/08/16 Javascript
JS 各种网页尺寸判断实例方法
2013/04/18 Javascript
jquery实现简单的拖拽效果实例兼容所有主流浏览器(优化篇)
2013/06/28 Javascript
让table变成exls的示例代码
2014/03/24 Javascript
JS 获取鼠标左右键的键值方法
2014/10/11 Javascript
详解JavaScript中的表单验证
2015/06/16 Javascript
基于jQuery仿淘宝产品图片放大镜代码分享
2020/06/23 Javascript
JS表单验证的代码(常用)
2016/04/08 Javascript
AngularJS中$watch和$timeout的使用示例
2016/09/20 Javascript
基于JQuery的购物车添加删除以及结算功能示例
2017/03/08 Javascript
自带气泡提示的vue校验插件(vue-verify-pop)
2017/04/07 Javascript
select2 ajax 设置默认值,初始值的方法
2018/08/09 Javascript
深入浅析Node.js 事件循环、定时器和process.nextTick()
2018/10/22 Javascript
微信小程序实现登录遮罩效果
2018/11/01 Javascript
微信JS-SDK updateAppMessageShareData安卓不能自定义分享详解
2019/03/29 Javascript
python目录操作之python遍历文件夹后将结果存储为xml
2014/01/27 Python
Python迭代器和生成器介绍
2015/03/06 Python
Django接受前端数据的几种方法总结
2016/11/04 Python
Python Django框架单元测试之文件上传测试示例
2019/05/17 Python
python使用writerows写csv文件产生多余空行的处理方法
2019/08/01 Python
flask框架蓝图和子域名配置详解
2020/01/25 Python
Python celery原理及运行流程解析
2020/06/13 Python
python requests库的使用
2021/01/06 Python
乐天旅游台湾网站:Rakuten Travel TW
2017/06/01 全球购物
夜大毕业生自我鉴定
2013/10/31 职场文书
会计学应届毕业生推荐信
2013/11/04 职场文书
应届生法律顾问求职信
2013/11/19 职场文书
《理想的风筝》教学反思
2014/04/11 职场文书
4s店销售经理岗位职责
2014/07/19 职场文书
党员创先争优心得体会
2014/09/11 职场文书
python如何为list实现find方法
2022/05/30 Python