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系列之从文件读取和保存数据
May 23 Python
Python常用列表数据结构小结
Aug 06 Python
python3编写C/S网络程序实例教程
Aug 25 Python
python导入时小括号大作用
Jan 10 Python
python中实现指定时间调用函数示例代码
Sep 08 Python
Selenium chrome配置代理Python版的方法
Nov 29 Python
Python3实现获取图片文字里中文的方法分析
Dec 13 Python
对python的unittest架构公共参数token提取方法详解
Dec 17 Python
Python函数装饰器实现方法详解
Dec 22 Python
一篇文章弄懂Python中的可迭代对象、迭代器和生成器
Aug 12 Python
Python爬取知乎图片代码实现解析
Sep 17 Python
深入理解Python 多线程
Jun 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
咖啡的化学
2021/03/03 咖啡文化
使用 MySQL Date/Time 类型
2008/03/26 PHP
php自动获取字符串编码函数mb_detect_encoding
2011/05/31 PHP
ThinkPHP中RBAC类的四种用法分析
2014/11/24 PHP
详解laravel passport OAuth2.0的4种模式
2019/11/04 PHP
Javascript和Ajax中文乱码吐血版解决方案
2009/12/21 Javascript
js操作ajax返回的json的注意问题!
2010/02/23 Javascript
浅析JavaScript中的常用算法与函数
2013/11/21 Javascript
无限树Jquery插件zTree的常用功能特性总结
2014/09/11 Javascript
浅谈JavaScript中指针和地址
2015/07/26 Javascript
详解vue-cli中配置sass
2017/06/21 Javascript
详解基于Koa2开发微信二维码扫码支付相关流程
2018/05/16 Javascript
python 网络爬虫初级实现代码
2016/02/27 Python
Python 的内置字符串方法小结
2016/03/15 Python
定制FileField中的上传文件名称实例
2017/08/23 Python
Java及python正则表达式详解
2017/12/27 Python
Python制作词云的方法
2018/01/03 Python
python爬虫获取小区经纬度以及结构化地址
2018/12/30 Python
Python模块的加载讲解
2019/01/15 Python
Python+pyplot绘制带文本标注的柱状图方法
2019/07/08 Python
python绘制直方图和密度图的实例
2019/07/08 Python
python3.7+selenium模拟淘宝登录功能的实现
2020/05/26 Python
python自动化发送邮件实例讲解
2021/01/04 Python
Python对excel的基本操作方法
2021/02/18 Python
利用html5 file api读取本地文件示例(如图片、PDF等)
2018/03/07 HTML / CSS
Html5元素及基本语法详解
2016/08/02 HTML / CSS
华丽的手绘陶瓷:MacKenzie-Childs
2017/02/04 全球购物
如何用JQuery进行表单验证
2013/05/29 面试题
高中生家长寄语大全
2014/04/03 职场文书
成立公司计划书
2014/05/07 职场文书
党在我心中演讲稿
2014/09/02 职场文书
信用卡结清证明怎么写
2014/09/13 职场文书
客房部经理岗位职责
2015/02/02 职场文书
2015年百日安全活动总结
2015/03/26 职场文书
Nginx+Windows搭建域名访问环境的操作方法
2022/03/17 Servers
PHP面试题 wakeup魔法 Ezpop pop序列化与反序列化
2022/04/11 PHP