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 相关文章推荐
Linux 下 Python 实现按任意键退出的实现方法
Sep 25 Python
Python中正则表达式详解
May 17 Python
python如何派生内置不可变类型并修改实例化行为
Mar 21 Python
Python 按字典dict的键排序,并取出相应的键值放于list中的实例
Feb 12 Python
详解python中list的使用
Mar 15 Python
在Django admin中编辑ManyToManyField的实现方法
Aug 09 Python
python 哈希表实现简单python字典代码实例
Sep 27 Python
python3中利用filter函数输出小于某个数的所有回文数实例
Nov 24 Python
pytorch:torch.mm()和torch.matmul()的使用
Dec 27 Python
Python获取android设备cpu和内存占用情况
Nov 15 Python
pytorch中Schedule与warmup_steps的用法说明
May 24 Python
Python实现PIL图像处理库绘制国际象棋棋盘
Jul 16 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
全国FM电台频率大全 - 9 上海市
2020/03/11 无线电
php each 返回数组中当前的键值对并将数组指针向前移动一步实例
2016/11/22 PHP
JS/FLASH实现复制代码到剪贴板(兼容所有浏览器)
2013/05/27 Javascript
javascript获取鼠标位置部分的实例代码(兼容IE,FF)
2013/08/05 Javascript
IE下写xml文件的两种方式(fso/saveAs)
2013/08/05 Javascript
javascript实现简单的Map示例介绍
2013/12/23 Javascript
Angular.js 实现数字转换汉字实例代码
2016/07/14 Javascript
jQuery时间验证和转换为标准格式的时间格式
2017/03/06 Javascript
从零开始学习Node.js系列教程四:多页面实现数学运算的client端和server端示例
2017/04/13 Javascript
ES6新特性二:Iterator(遍历器)和for-of循环详解
2017/04/20 Javascript
jQuery实现获取及设置CSS样式操作详解
2018/09/05 jQuery
详解如何在vscode里面调试js和node.js的方法步骤
2018/12/24 Javascript
微信公众号平台接口开发 获取微信服务器IP地址方法解析
2019/08/14 Javascript
使用vuex较为优雅的实现一个购物车功能的示例代码
2019/12/09 Javascript
javascript 使用sleep函数的常见方法详解
2020/04/26 Javascript
解决vue页面刷新,数据丢失的问题
2020/11/24 Vue.js
[01:13]这,就是刀塔
2014/07/16 DOTA
Python获取DLL和EXE文件版本号的方法
2015/03/10 Python
python模块之StringIO使用示例
2015/04/08 Python
PyTorch快速搭建神经网络及其保存提取方法详解
2018/04/28 Python
pytorch读取图像数据转成opencv格式实例
2020/06/02 Python
在keras 中获取张量 tensor 的维度大小实例
2020/06/10 Python
Ubuntu 20.04安装Pycharm2020.2及锁定到任务栏的问题(小白级操作)
2020/10/29 Python
python 实现全球IP归属地查询工具
2020/12/18 Python
详解CSS3的图层阴影和文字阴影效果使用
2016/06/09 HTML / CSS
CSS实现雨滴动画效果的实例代码
2019/10/08 HTML / CSS
药品质量检测应届生求职信
2013/11/14 职场文书
保险专业自荐信范文
2014/02/20 职场文书
内科护士节演讲稿
2014/09/11 职场文书
普通党员个人对照检查材料
2014/09/18 职场文书
乡镇干部个人对照检查材料思想汇报(原创篇)
2014/09/28 职场文书
毕业生个人自荐书
2015/03/05 职场文书
《世界多美呀》教学反思
2016/02/22 职场文书
朋友圈早安励志语录!
2019/07/08 职场文书
python利用while求100内的整数和方式
2021/11/07 Python
vue ref如何获取子组件属性值
2022/03/31 Vue.js