用python介绍4种常用的单链表翻转的方法小结


Posted in Python onFebruary 24, 2020

如何把一个单链表进行反转?

方法1:将单链表储存为数组,然后按照数组的索引逆序进行反转。

方法2:使用3个指针遍历单链表,逐个链接点进行反转。

方法3:从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,最后将第一个节点挪到新表的表尾。

方法4: 递归(相信我们都熟悉的一点是,对于树的大部分问题,基本可以考虑用递归来解决。但是我们不太熟悉的一点是,对于单链表的一些问题,也可以使用递归。可以认为单链表是一颗永远只有左(右)子树的树,因此可以考虑用递归来解决。或者说,因为单链表本身的结构也有自相似的特点,所以可以考虑用递归来解决)

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

# -*- coding: utf-8 -*-
'''
链表逆序
'''
class ListNode: 
  def __init__(self,x): 
    self.val=x
    self.next=None
 
'''
第一种方法:
对于一个长度为n的单链表head,用一个大小为n的数组arr储存从单链表从头
到尾遍历的所有元素,在从arr尾到头读取元素简历一个新的单链表
时间消耗O(n),空间消耗O(n)
'''   
def reverse_linkedlist1(head):
  if head == None or head.next == None: #边界条件
    return head
  arr = [] # 空间消耗为n,n为单链表的长度
  while head:
    arr.append(head.val)
    head = head.next
  newhead = ListNode(0)
  tmp = newhead
  for i in arr[::-1]:
    tmp.next = ListNode(i)
    tmp = tmp.next
  return newhead.next
 
'''
开始以单链表的第一个元素为循环变量cur,并设置2个辅助变量tmp,保存数据;
newhead,新的翻转链表的表头。
时间消耗O(n),空间消耗O(1)
'''
 
def reverse_linkedlist2(head):
  if head == None or head.next == None: #边界条件
    return head
  cur = head #循环变量
  tmp = None #保存数据的临时变量
  newhead = None #新的翻转单链表的表头
  while cur:
    tmp = cur.next
    cur.next = newhead
    newhead = cur  # 更新 新链表的表头
    cur = tmp
  return newhead
   
'''
开始以单链表的第二个元素为循环变量,用2个变量循环向后操作,并设置1个辅助变量tmp,保存数据;
时间消耗O(n),空间消耗O(1)
'''
 
 
def reverse_linkedlist3(head):
  if head == None or head.next == None: #边界条件
    return head
  p1 = head #循环变量1
  p2 = head.next #循环变量2
  tmp = None #保存数据的临时变量
  while p2:
    tmp = p2.next
    p2.next = p1
    p1 = p2
    p2 = tmp
  head.next = None
  return p1
 
'''
递归操作,先将从第一个点开始翻转转换从下一个节点开始翻转
直至只剩一个节点
时间消耗O(n),空间消耗O(1)
'''
 
def reverse_linkedlist4(head):
  if head is None or head.next is None:
    return head
  else:
    newhead=reverse_linkedlist4(head.next)
    head.next.next=head
    head.next=None
  return newhead
 
     
def create_ll(arr):
  pre = ListNode(0)
  tmp = pre
  for i in arr:
    tmp.next = ListNode(i)
    tmp = tmp.next
  return pre.next
   
def print_ll(head):
  tmp = head
  while tmp:
    print tmp.val
    tmp=tmp.next
 
a = create_ll(range(5))
print_ll(a) # 0 1 2 3 4
a = reverse_linkedlist1(a)
print_ll(a) # 4 3 2 1 0
a = reverse_linkedlist2(a)
print_ll(a) # 0 1 2 3 4
a = reverse_linkedlist3(a)
print_ll(a) # 4 3 2 1 0
a = reverse_linkedlist4(a)
print_ll(a) # 0 1 2 3 4

到此这篇关于用python介绍4种常用的单链表翻转的方法小结的文章就介绍到这了,更多相关python 单链表翻转内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木! 

Python 相关文章推荐
分享15个最受欢迎的Python开源框架
Jul 13 Python
Python的高级Git库 Gittle
Sep 22 Python
浅谈对yield的初步理解
May 29 Python
Python pickle模块实现对象序列化
Nov 22 Python
python 通过视频url获取视频的宽高方式
Dec 10 Python
python单例设计模式实现解析
Jan 07 Python
Pytest参数化parametrize使用代码实例
Feb 22 Python
Django mysqlclient安装和使用详解
Sep 17 Python
详解Selenium-webdriver绕开反爬虫机制的4种方法
Oct 28 Python
Python使用struct处理二进制(pack和unpack用法)
Nov 12 Python
python+selenium自动化实战携带cookies模拟登陆微博
Jan 19 Python
python游戏开发之pygame实现接球小游戏
Apr 22 Python
关于多元线性回归分析——Python&SPSS
Feb 24 #Python
使用 pytorch 创建神经网络拟合sin函数的实现
Feb 24 #Python
sklearn+python:线性回归案例
Feb 24 #Python
深入理解Tensorflow中的masking和padding
Feb 24 #Python
K最近邻算法(KNN)---sklearn+python实现方式
Feb 24 #Python
Python3.6 + TensorFlow 安装配置图文教程(Windows 64 bit)
Feb 24 #Python
Python enumerate内置库用法解析
Feb 24 #Python
You might like
YB217、YB235、YB400浅听
2021/03/02 无线电
模拟flock实现文件锁定
2007/02/14 PHP
php cli 方式 在crotab中运行解决
2010/02/08 PHP
PHP 常用的header头部定义汇总
2015/06/19 PHP
PHP版QQ互联OAuth示例代码分享
2015/07/05 PHP
php对二维数组进行相关操作(排序、转换、去空白等)
2015/11/04 PHP
MC Dialog js弹出层 完美兼容多浏览器(5.6更新)
2010/05/06 Javascript
Js日期选择器并自动加入到输入框中示例代码
2013/08/02 Javascript
node.js中的http.response.writeHead方法使用说明
2014/12/14 Javascript
JavaScript阻止事件冒泡示例分享
2014/12/28 Javascript
剖析Node.js异步编程中的回调与代码设计模式
2016/02/16 Javascript
PHP获取当前页面完整URL的方法
2016/12/02 Javascript
JS正则子匹配实例分析
2016/12/22 Javascript
EasyUI为Numberbox添加blur事件的方法
2017/03/05 Javascript
总结js中的一些兼容性易错的问题
2017/12/18 Javascript
node.js部署之启动后台运行forever的方法
2018/05/23 Javascript
解析vue data不可以使用箭头函数问题
2018/07/03 Javascript
vue计算属性无法监听到数组内部变化的解决方案
2019/11/06 Javascript
vue 封装 Adminlte3组件的实现
2020/03/18 Javascript
如何修改Vue打包后文件的接口地址配置的方法
2020/04/22 Javascript
Vue实现Header渐隐渐现效果的实例代码
2020/11/05 Javascript
vue3.0封装轮播图组件的步骤
2021/03/04 Vue.js
[01:49]一目了然!DOTA2DotA快捷操作对比第二弹
2014/05/16 DOTA
python基于xmlrpc实现二进制文件传输的方法
2015/06/02 Python
Python打印输出数组中全部元素
2018/03/13 Python
python向已存在的excel中新增表,不覆盖原数据的实例
2018/05/02 Python
Python使用pickle模块实现序列化功能示例
2018/07/13 Python
python退出循环的方法
2020/06/18 Python
关于python3.9安装wordcloud出错的问题及解决办法
2020/11/02 Python
html5 移动端视频video的android兼容(去除播放控件、全屏)
2020/03/26 HTML / CSS
Fossil加拿大官网:化石手表、手袋、首饰及配饰
2019/04/23 全球购物
卫生安全检查制度
2014/02/04 职场文书
建筑工地宣传标语
2014/06/18 职场文书
设计专业毕业生求职信
2014/06/25 职场文书
生日宴会祝酒词
2015/08/10 职场文书
HTML中的表单Form实现居中效果
2021/05/25 HTML / CSS