这里给出了4种4种常用的单链表翻转的方法,分别是:

开辟辅助数组,新建表头反转,就地反转,递归反转

  1. # -*- coding: utf-8 -*-
  2. '''
  3. 链表逆序
  4. '''
  5. class ListNode:
  6. def __init__(self,x):
  7. self.val=x
  8. self.next=None
  9.  
  10. '''
  11. 第一种方法:
  12. 对于一个长度为n的单链表head,用一个大小为n的数组arr储存从单链表从头
  13. 到尾遍历的所有元素,在从arr尾到头读取元素简历一个新的单链表
  14. 时间消耗O(n),空间消耗O(n)
  15. '''
  16. def reverse_linkedlist1(head):
  17. if head == None or head.next == None: #边界条件
  18. return head
  19. arr = [] # 空间消耗为n,n为单链表的长度
  20. while head:
  21. arr.append(head.val)
  22. head = head.next
  23. newhead = ListNode(0)
  24. tmp = newhead
  25. for i in arr[::-1]:
  26. tmp.next = ListNode(i)
  27. tmp = tmp.next
  28. return newhead.next
  29.  
  30. '''
  31. 开始以单链表的第一个元素为循环变量cur,并设置2个辅助变量tmp,保存数据;
  32. newhead,新的翻转链表的表头。
  33. 时间消耗O(n),空间消耗O(1)
  34. '''
  35.  
  36. def reverse_linkedlist2(head):
  37. if head == None or head.next == None: #边界条件
  38. return head
  39. cur = head #循环变量
  40. tmp = None #保存数据的临时变量
  41. newhead = None #新的翻转单链表的表头
  42. while cur:
  43. tmp = cur.next
  44. cur.next = newhead
  45. newhead = cur # 更新 新链表的表头
  46. cur = tmp
  47. return newhead
  48.  
  49. '''
  50. 开始以单链表的第二个元素为循环变量,用2个变量循环向后操作,并设置1个辅助变量tmp,保存数据;
  51. 时间消耗O(n),空间消耗O(1)
  52. '''
  53.  
  54. def reverse_linkedlist3(head):
  55. if head == None or head.next == None: #边界条件
  56. return head
  57. p1 = head #循环变量1
  58. p2 = head.next #循环变量2
  59. tmp = None #保存数据的临时变量
  60. while p2:
  61. tmp = p2.next
  62. p2.next = p1
  63. p1 = p2
  64. p2 = tmp
  65. head.next = None
  66. return p1
  67.  
  68. '''
  69. 递归操作,先将从第一个点开始翻转转换从下一个节点开始翻转
  70. 直至只剩一个节点
  71. 时间消耗O(n),空间消耗O(1)
  72. '''
  73.  
  74. def reverse_linkedlist4(head):
  75. if head is None or head.next is None:
  76. return head
  77. else:
  78. newhead=reverse_linkedlist4(head.next)
  79. head.next.next=head
  80. head.next=None
  81. return newhead
  82.  
  83. def create_ll(arr):
  84. pre = ListNode(0)
  85. tmp = pre
  86. for i in arr:
  87. tmp.next = ListNode(i)
  88. tmp = tmp.next
  89. return pre.next
  90.  
  91. def print_ll(head):
  92. tmp = head
  93. while tmp:
  94. print tmp.val
  95. tmp=tmp.next
  96.  
  97. a = create_ll(range(5))
  98. print_ll(a) # 0 1 2 3 4
  99. a = reverse_linkedlist1(a)
  100. print_ll(a) # 4 3 2 1 0
  101. a = reverse_linkedlist2(a)
  102. print_ll(a) # 0 1 2 3 4
  103. a = reverse_linkedlist3(a)
  104. print_ll(a) # 4 3 2 1 0
  105. a = reverse_linkedlist4(a)
  106. print_ll(a) # 0 1 2 3 4

本文转载自:https://blog.csdn.net/u011452172/article/details/78127836 

用python介绍4种常用的单链表翻转的方法的更多相关文章

  1. 干货:结合Scikit-learn介绍几种常用的特征选择方法

    原文  http://dataunion.org/14072.html 主题 特征选择 scikit-learn 作者: Edwin Jarvis 特征选择(排序)对于数据科学家.机器学习从业者来说非 ...

  2. 结合Scikit-learn介绍几种常用的特征选择方法

    特征选择(排序)对于数据科学家.机器学习从业者来说非常重要.好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点.底层结构,这对进一步改善模型.算法都有着重要作用. 特征选择主要有两个功能: 减 ...

  3. [转载]Scikit-learn介绍几种常用的特征选择方法

    #### [转载]原文地址:http://dataunion.org/14072.html 特征选择(排序)对于数据科学家.机器学习从业者来说非常重要.好的特征选择能够提升模型的性能,更能帮助我们理解 ...

  4. Java实现单链表翻转

    单链表翻转比方有例如以下链表: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZmVuZ3NoaXp0eQ==/font/5a6L5L2T/fontsize ...

  5. 时间复杂度分别为 O(n)和 O(1)的删除单链表结点的方法

    有一个单链表,提供了头指针和一个结点指针,设计一个函数,在 O(1)时间内删除该结点指针指向的结点. 众所周知,链表无法随机存储,只能从头到尾去遍历整个链表,遇到目标节点之后删除之,这是最常规的思路和 ...

  6. 【数据结构】单链表介绍及leetcode206题反转单链表python实现

    题目传送门:https://leetcode-cn.com/problems/reverse-linked-list/ 文章目录 单链表介绍 链表 概念 种类 优缺点 单链表(slist) leetc ...

  7. 二、python 中五种常用的数据类型

    一.字符串 单引号定义: str1 = 'hello' 双引号定义: str1 = "hello" 三引号定义:""" 人生苦短, 我用python! ...

  8. Python实现不带头结点的单链表

    1 # 创建一个节点类 2 class Node: 3 def __init__(self, item): 4 self.item = item 5 self.next = None 6 7 8 # ...

  9. Python之几种常用模块

    模块 注意事项: 所有的模块导入都应该尽量往上写 内置模块 扩展模块 自定义模块 模块不会重复被导入 : sys.moudles 从哪儿导入模块 : sys.path import import 模块 ...

随机推荐

  1. nvm安装nodejs(安装在非系统盘内)

    在使用nodejs时有时需要不同的版本之间进行切换,所以就用到了版本管理工具nvm,在windows系统下用的是nvm-windows,这里选择的是nvm-noinstall.zip免安装版本(需要配 ...

  2. 禁止windows自动更新后重新启动

    运行gpedit.msc: 按照下图操作: 参考:http://www.xitongcheng.com/jiaocheng/win7_article_94.html

  3. 富文本编辑器Ueditor的使用

    1.下载:http://ueditor.baidu.com/website/download.html. 2.解压,并放到项目webapp下. 3.jsp页面的配置. 4.配置根路径. 5.页面展示: ...

  4. Object.keys 函数 (JavaScript)

    Object.keys 函数 (JavaScript) 返回对象的可枚举属性和方法的名称. 在实际开发中,我们有时需要知道对象的所有属性,原生js给我们提供了一个很好的方法:Object.keys() ...

  5. IOS 控制器View的创建方式(方式的优先级 、view的延迟加载)

    MJViewController的view的创建 的方式的优先级 控制器view的延迟加载 ● 控制器的view是延迟加载的:用到时再加载 ● 可以用isViewLoaded方法判断一个UIViewC ...

  6. hdu-1875 畅通工程再续---MST

    题目链接: https://vjudge.net/problem/HDU-1875 题目大意: 相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小 ...

  7. geoNear查询 near查询的升级版

    geoNear查询可以看作是near查询点进化版 geoNear查询使用runCommand命令进行使用,常用使用如下: db.runCommand({ geoNear:<collection& ...

  8. fdisk - Linux分区表操作工具软件

    总览 fdisk [-u]设备名 fdisk -l [-u] [设备名 ...] fdisk -s分区 ... fdisk -v 描述 硬盘可以被分成一个或多个逻辑磁盘,称为 分区. 这些分区信息都存 ...

  9. Mac 系统 + Chrome浏览器 网页前端出现中文文字反转或顺序错乱

    问题背景 React开发的系统,收到一个BUG反馈,*"号个人统计"文字不正确,应为"个人号统计"*. 收到BUG后,打开浏览器查验是什么情况,难道犯了最基本的 ...

  10. java算法面试题:金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出。

    package com.swift; public class RenMingBi { private static final char[] data = new char[]{'零','壹','贰 ...