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字符串和文件操作常用函数分析
Apr 08 Python
Python与人工神经网络:使用神经网络识别手写图像介绍
Dec 19 Python
Django框架教程之正则表达式URL误区详解
Jan 28 Python
python3.4.3下逐行读入txt文本并去重的方法
Apr 29 Python
Python3.4解释器用法简单示例
Mar 22 Python
Python集中化管理平台Ansible介绍与YAML简介
Jun 12 Python
PyQt5组件读取参数的实例
Jun 25 Python
用Python调用win命令行提高工作效率的实例
Aug 14 Python
Python定时发送天气预报邮件代码实例
Sep 09 Python
python读文件的步骤
Oct 08 Python
python批量修改文件名的示例
Sep 27 Python
python批量合成bilibili的m4s缓存文件为MP4格式 ver2.5
Dec 01 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
$_GET['goods_id']+0 的使用详解
2013/06/06 PHP
PHP中的替代语法介绍
2015/01/09 PHP
PHP基于堆栈实现的高级计算器功能示例
2017/09/15 PHP
PHP实现cookie跨域session共享的方法分析
2019/08/23 PHP
php写入文件不覆盖的实例讲解
2019/09/17 PHP
JQuery小知识
2010/10/15 Javascript
javascript jq 弹出层实例
2013/08/25 Javascript
简单选项卡 js和jquery制作方法分享
2014/02/26 Javascript
js获取input长度并根据页面宽度设置其大小及居中对齐
2014/08/22 Javascript
node.js中的fs.rename方法使用说明
2014/12/16 Javascript
JavaScript定时显示广告代码分享
2015/03/02 Javascript
jQuery实现防止提交按钮被双击的方法
2015/03/24 Javascript
使用jQuery Mobile框架开发移动端Web App的入门教程
2016/05/17 Javascript
JavaScript原型继承_动力节点Java学院整理
2017/06/30 Javascript
JS获取填报扩展单元格控件的值的解决办法
2017/07/14 Javascript
详解基于Vue cli生成的Vue项目的webpack4升级
2018/06/19 Javascript
vue+element-ui动态生成多级表头的方法
2018/08/28 Javascript
vue根据进入的路由进行原路返回的方法
2018/09/26 Javascript
纯 JS 实现放大缩小拖拽功能(完整代码)
2019/11/25 Javascript
[01:34]DOTA2 7.22版本新增神杖效果一览(敏捷英雄篇)
2019/05/28 DOTA
python实现将文本转换成语音的方法
2015/05/28 Python
python requests 使用快速入门
2017/08/31 Python
python 3.6.5 安装配置方法图文教程
2018/09/18 Python
Python3.8中使用f-strings调试
2019/05/22 Python
Spring实战之使用util:命名空间简化配置操作示例
2019/12/09 Python
使用matplotlib动态刷新指定曲线实例
2020/04/23 Python
python3判断IP地址的方法
2021/03/04 Python
使用PDF.JS插件在HTML中预览PDF文件的方法
2018/08/29 HTML / CSS
国外平面设计素材网站:The Hungry JPEG
2017/03/28 全球购物
REISS美国官网:伦敦最受欢迎的时尚品牌
2019/08/16 全球购物
终止劳动合同协议书
2014/10/05 职场文书
2014年打非治违工作总结
2014/11/13 职场文书
答谢词范文
2015/01/05 职场文书
python基于tkinter制作无损音乐下载工具
2021/03/29 Python
解决Navicat for Mysql连接报错1251的问题(连接失败)
2021/05/27 MySQL
深入理解go缓存库freecache的使用
2022/02/15 Golang