用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 相关文章推荐
python网络爬虫采集联想词示例
Feb 11 Python
使用wxPython获取系统剪贴板中的数据的教程
May 06 Python
Django的信号机制详解
May 05 Python
Python爬虫实现简单的爬取有道翻译功能示例
Jul 13 Python
python实现Excel文件转换为TXT文件
Apr 28 Python
Python当中的array数组对象实例详解
Jun 12 Python
python 自动轨迹绘制的实例代码
Jul 05 Python
python requests证书问题解决
Sep 05 Python
python实现提取str字符串/json中多级目录下的某个值
Feb 27 Python
如何提高python 中for循环的效率
Apr 15 Python
python递归函数用法详解
Oct 26 Python
matplotlib事件处理基础(事件绑定、事件属性)
Feb 03 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
一个简单的MySQL数据浏览器
2006/10/09 PHP
php简单定时执行任务的实现方法
2015/02/23 PHP
PHP对XML内容进行修改和删除实例代码
2016/10/26 PHP
PHP对象相关知识总结
2017/04/09 PHP
php使用curl实现ftp文件下载功能
2017/05/16 PHP
jquery ajax 登录验证实现代码
2009/09/23 Javascript
基于jquery的二级联动菜单实现代码
2011/04/25 Javascript
js事件监听器用法实例详解
2015/06/01 Javascript
详解javascript遍历方式
2015/11/11 Javascript
JS实现类似百叶窗下拉菜单效果
2016/12/30 Javascript
javascript设计模式之Adapter模式【适配器模式】实现方法示例
2017/01/13 Javascript
VueJs使用Amaze ui调整列表和内容页面
2017/11/30 Javascript
bootstrap-table.js扩展分页工具栏(增加跳转到xx页)功能
2017/12/28 Javascript
Taro集成Redux快速上手的方法示例
2018/06/21 Javascript
vue2.0 中使用transition实现动画效果使用心得
2018/08/13 Javascript
2019最新21个MySQL高频面试题介绍
2020/02/06 Javascript
JavaScript点击按钮生成4位随机验证码
2021/01/28 Javascript
Python 专题五 列表基础知识(二维list排序、获取下标和处理txt文本实例)
2017/03/20 Python
python机器学习实战之K均值聚类
2017/12/20 Python
python通过elixir包操作mysql数据库实例代码
2018/01/31 Python
Django实战之用户认证(用户登录与注销)
2018/07/16 Python
python for 循环获取index索引的方法
2019/02/01 Python
Pycharm 字体大小调整设置的方法实现
2019/09/27 Python
Django实现文件上传下载功能
2019/10/06 Python
Python matplotlib以日期为x轴作图代码实例
2019/11/22 Python
python 和c++实现旋转矩阵到欧拉角的变换方式
2019/12/04 Python
pytorch实现CNN卷积神经网络
2020/02/19 Python
德国机场停车位比较和预订网站:Ich-parke-billiger
2018/01/08 全球购物
KIKO MILANO西班牙官网:意大利领先的化妆品和护肤品品牌
2019/05/03 全球购物
Hotels.com泰国:酒店预订网站
2019/11/20 全球购物
意向书范文
2014/03/31 职场文书
让世界充满爱演讲稿
2014/05/24 职场文书
2014年教师节活动总结
2014/08/29 职场文书
公司董事任命书
2015/09/21 职场文书
《总之就是很可爱》新作短篇动画《总之就是很可爱~制服~》将于2022年夏天播出
2022/04/07 日漫
JavaScript中10个Reduce常用场景技巧
2022/06/21 Javascript