用python介绍4种常用的单链表翻转的方法
这里给出了4种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
本文转载自:https://blog.csdn.net/u011452172/article/details/78127836
用python介绍4种常用的单链表翻转的方法的更多相关文章
- 干货:结合Scikit-learn介绍几种常用的特征选择方法
原文 http://dataunion.org/14072.html 主题 特征选择 scikit-learn 作者: Edwin Jarvis 特征选择(排序)对于数据科学家.机器学习从业者来说非 ...
- 结合Scikit-learn介绍几种常用的特征选择方法
特征选择(排序)对于数据科学家.机器学习从业者来说非常重要.好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点.底层结构,这对进一步改善模型.算法都有着重要作用. 特征选择主要有两个功能: 减 ...
- [转载]Scikit-learn介绍几种常用的特征选择方法
#### [转载]原文地址:http://dataunion.org/14072.html 特征选择(排序)对于数据科学家.机器学习从业者来说非常重要.好的特征选择能够提升模型的性能,更能帮助我们理解 ...
- Java实现单链表翻转
单链表翻转比方有例如以下链表: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZmVuZ3NoaXp0eQ==/font/5a6L5L2T/fontsize ...
- 时间复杂度分别为 O(n)和 O(1)的删除单链表结点的方法
有一个单链表,提供了头指针和一个结点指针,设计一个函数,在 O(1)时间内删除该结点指针指向的结点. 众所周知,链表无法随机存储,只能从头到尾去遍历整个链表,遇到目标节点之后删除之,这是最常规的思路和 ...
- 【数据结构】单链表介绍及leetcode206题反转单链表python实现
题目传送门:https://leetcode-cn.com/problems/reverse-linked-list/ 文章目录 单链表介绍 链表 概念 种类 优缺点 单链表(slist) leetc ...
- 二、python 中五种常用的数据类型
一.字符串 单引号定义: str1 = 'hello' 双引号定义: str1 = "hello" 三引号定义:""" 人生苦短, 我用python! ...
- Python实现不带头结点的单链表
1 # 创建一个节点类 2 class Node: 3 def __init__(self, item): 4 self.item = item 5 self.next = None 6 7 8 # ...
- Python之几种常用模块
模块 注意事项: 所有的模块导入都应该尽量往上写 内置模块 扩展模块 自定义模块 模块不会重复被导入 : sys.moudles 从哪儿导入模块 : sys.path import import 模块 ...
随机推荐
- nvm安装nodejs(安装在非系统盘内)
在使用nodejs时有时需要不同的版本之间进行切换,所以就用到了版本管理工具nvm,在windows系统下用的是nvm-windows,这里选择的是nvm-noinstall.zip免安装版本(需要配 ...
- 禁止windows自动更新后重新启动
运行gpedit.msc: 按照下图操作: 参考:http://www.xitongcheng.com/jiaocheng/win7_article_94.html
- 富文本编辑器Ueditor的使用
1.下载:http://ueditor.baidu.com/website/download.html. 2.解压,并放到项目webapp下. 3.jsp页面的配置. 4.配置根路径. 5.页面展示: ...
- Object.keys 函数 (JavaScript)
Object.keys 函数 (JavaScript) 返回对象的可枚举属性和方法的名称. 在实际开发中,我们有时需要知道对象的所有属性,原生js给我们提供了一个很好的方法:Object.keys() ...
- IOS 控制器View的创建方式(方式的优先级 、view的延迟加载)
MJViewController的view的创建 的方式的优先级 控制器view的延迟加载 ● 控制器的view是延迟加载的:用到时再加载 ● 可以用isViewLoaded方法判断一个UIViewC ...
- hdu-1875 畅通工程再续---MST
题目链接: https://vjudge.net/problem/HDU-1875 题目大意: 相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小 ...
- geoNear查询 near查询的升级版
geoNear查询可以看作是near查询点进化版 geoNear查询使用runCommand命令进行使用,常用使用如下: db.runCommand({ geoNear:<collection& ...
- fdisk - Linux分区表操作工具软件
总览 fdisk [-u]设备名 fdisk -l [-u] [设备名 ...] fdisk -s分区 ... fdisk -v 描述 硬盘可以被分成一个或多个逻辑磁盘,称为 分区. 这些分区信息都存 ...
- Mac 系统 + Chrome浏览器 网页前端出现中文文字反转或顺序错乱
问题背景 React开发的系统,收到一个BUG反馈,*"号个人统计"文字不正确,应为"个人号统计"*. 收到BUG后,打开浏览器查验是什么情况,难道犯了最基本的 ...
- java算法面试题:金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出。
package com.swift; public class RenMingBi { private static final char[] data = new char[]{'零','壹','贰 ...