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迭代器的使用方法实例
Nov 21 Python
pyramid配置session的方法教程
Nov 27 Python
剖析Python的Tornado框架中session支持的实现代码
Aug 21 Python
python DataFrame 修改列的顺序实例
Apr 10 Python
Python3利用Dlib19.7实现摄像头人脸识别的方法
May 11 Python
pycharm运行和调试不显示结果的解决方法
Nov 30 Python
pycharm 批量修改变量名称的方法
Aug 01 Python
Python+OpenCV 实现图片无损旋转90°且无黑边
Dec 12 Python
关于torch.optim的灵活使用详解(包括重写SGD,加上L1正则)
Feb 20 Python
python GUI库图形界面开发之PyQt5 MDI(多文档窗口)QMidArea详细使用方法与实例
Mar 05 Python
在pycharm中文件取消用 pytest模式打开的操作
Sep 01 Python
我对PyTorch dataloader里的shuffle=True的理解
May 20 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
PHP5.2下chunk_split()函数整数溢出漏洞 分析
2007/06/06 PHP
解析mysql 表中的碎片产生原因以及清理
2013/06/22 PHP
php的$_FILES的临时储存文件与回收机制实测过程
2013/07/12 PHP
PHP+redis实现的购物车单例类示例
2019/02/02 PHP
EXTJS内使用ACTIVEX控件引起崩溃问题的解决方法
2010/03/31 Javascript
基于jquery的不规则矩形的排列实现代码
2012/04/16 Javascript
基于js disabled="false"不起作用的解决办法
2013/06/26 Javascript
jquery链式操作的正确使用方法
2014/01/06 Javascript
node.js中的http.response.getHeader方法使用说明
2014/12/14 Javascript
深入理解JavaScript系列(44):设计模式之桥接模式详解
2015/03/04 Javascript
jquery点击缩略图切换视频播放特效代码分享
2015/09/15 Javascript
JS实现图片平面旋转的方法
2016/03/01 Javascript
Node.js 应用跑得更快 10 个技巧
2016/04/03 Javascript
jQuery中使用animate自定义动画的方法
2016/05/29 Javascript
微信小程序  生命周期详解
2016/10/27 Javascript
超全面的vue.js使用总结
2017/02/12 Javascript
解决angularjs WdatePicker ng-model的问题
2018/09/13 Javascript
vue 中使用 watch 出现了如下的报错的原因分析
2019/05/21 Javascript
React 实现车牌键盘的示例代码
2019/12/20 Javascript
JS 逻辑判断不要只知道用 if-else 和 switch条件判断(小技巧)
2020/05/27 Javascript
[02:57]DOTA2亚洲邀请赛 SECRET战队出场宣传片
2015/02/07 DOTA
用python 制作图片转pdf工具
2015/01/30 Python
利用Python命令行传递实例化对象的方法
2016/11/02 Python
python2.7+selenium2实现淘宝滑块自动认证功能
2018/02/24 Python
Python入门之后再看点什么好?
2018/03/05 Python
通过Python 接口使用OpenCV的方法
2018/04/02 Python
python实现维吉尼亚算法
2019/03/20 Python
Python音频操作工具PyAudio上手教程详解
2019/06/26 Python
pytorch 自定义卷积核进行卷积操作方式
2019/12/30 Python
几款Python编译器比较与推荐(小结)
2020/10/15 Python
如何查找和删除数据库中的重复数据
2014/11/05 面试题
2014领导干部学习焦裕禄同志先进事迹思想汇报
2014/09/19 职场文书
2014年留守儿童工作总结
2014/12/10 职场文书
施工安全协议书
2016/03/22 职场文书
2016年“我们的节日·中秋节”活动总结
2016/04/05 职场文书
浅谈Python数学建模之固定费用问题
2021/06/23 Python