LC206. 反转链表

Q:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

 示例:

示例1:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

示例2:
输入:head = [1,2]
输出:[2,1]

示例3:
输入:head = []
输出:[]

提示:

  • 链表中节点的数目范围是 [0, 5000]
  • -5000 <= Node.val <= 5000

A:思路:该题属于简单题,看到该题可能突然会有的思路是,反向遍历题目给的链表,并逐步创建一个一个新节点,进而生成一个新的符合题意的链表再返回其头结点,这样做虽可以达到目的,但是复杂度却高了。

  其实拿到链表类的题,我们最应该想到的是:改变指针。那么有了这一想法,该题目就很容易去解决了,只要我们不断的更改相邻两个节点之间的指针的方向,使其变为反方向即可完成反转链表。

  以下是Java代码,仅供参考:

  双指针法

public ListNode reverseList(ListNode head) {         if(head == null) return head; // 如果head为null,则不需反转,直接返回即可         ListNode cur = head;         ListNode pre = null;         while(cur != null){             ListNode temp = cur.next; // 用于存储cur的下一个节点,因为cur的next指针要更改方向了             cur.next = pre; // 更改指针方向             pre = cur; // pre前移,指向cur             cur = temp; // cur前移,指向temp         }     }

  递归法

public ListNode reverseList(ListNode head) {
        if(head == null) return head;
        return reverse(null, head);
    }
   // 递归函数
public ListNode reverse(ListNode pre, ListNode cur){
        if(cur == null) return pre; // 递归终止条件,当cur == null时,返回pre
        ListNode temp = cur.next; // 因为要改变指针方向,所以要提前存储cur.next
        cur.next = pre; // 改变指针方向
        return reverse(cur, temp); // 等价于:pre = cur, cur = temp
    }

 

本文转载于网络 如有侵权请联系删除

相关文章

  • Flask 学习-8. jsonify返回中文没正常显示问题

    前言Flask接口返回的json格式数据有中文的时候,默认是以ASCII码返回的,没正常显示中文。jsonify返回json数据函数直接返回dict数据或返回jsonfy()函数处理的数据,都是以json格式返回的fromflaskimportFlask,jsonify fromflaskimportrender_template fromflaskimportrequest app=Flask(__name__) @app.route('/json1',methods=['GET']) defjson_demo1(): user=request.args.get('user') return{"code":0,"data":user,"msg":"查询成功"} @app.route('/json2',methods=['GET']) defjson_demo2(): user=request.args.

  • HTTP/3发布了,我们来谈谈HTTP/3

    点击上方“芋道源码”,选择“设为星标”管她前浪,还是后浪?能浪的浪,才是好浪! 每天10:33 更新文章,每天掉亿点点头发...源码精品专栏原创|Java2021 超神之路,很肝~ 中文详细注释的开源项目 RPC框架Dubbo源码解析网络应用框架Netty源码解析 消息中间件RocketMQ源码解析 数据库中间件Sharding-JDBC和MyCAT源码解析作业调度中间件Elastic-Job源码解析分布式事务中间件TCC-Transaction源码解析Eureka和Hystrix源码解析Java并发源码来源:know.shuerbuzuo.cn/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/HTTP3.html#%E6%B5%8F%E8%A7%88%E6%8E%A7%E5%88%B6HTTP历史QUIC协议概览0RTT建立连接连接迁移队头阻塞/多路复用拥塞控制浏览控制HTTP历史1991HTTP/1.12009Google设计了基于TCP的SPDY2013QUIC2015HTTP/22018HTTP/3HTTP3是在保持QUIC稳定性的同

  • Rpc接口压测

    前言现今有比较多的rpc框架应用于实际的生产中,像比较流行的Dubbo、Motan、Thrift、Grpc等。今天作者将以最近项目中用到的grpc为例,结合jmeter来介绍下rpc压测实施步骤。学习本文前需对rpc框架、jmeter有个大致的了解,知道rpc如何用工具生成各种语言的代码。Grpc本身是支持很多种语言的,而jmeter本身只支持java语言,因此我们的脚本也需要选用java。步骤一:rpc脚本准备先来看看我本地的项目目录,对结果有个大致的了解,我的工程里包含多个微服务(gnid、hdr等)的代码,每个微服务我建了一个包。这里只以gnid为例来说明:1.IDE新建maven项目,修改pom.xml,加入grpc、jmeter的依赖包,以及grpc的代码生成插件<brstyle="box-sizing:border-box;"/>在src/main/java下新建目录(如命名proto),将项目的.proto文件copy进去,如图1中的gnid.proto执行”maveninstall”,会生成相应的通信及服务代码4.将图3中生成的代码cop

  • Hive重点难点:Hive原理&优化&面试(上)

    你可以先看看这几篇文章:《大数据方向另一个十年开启|《硬刚系列》第一版完结》《硬刚Hive|4万字基础调优面试小总结》《当我们在学习Hive的时候在学习什么?「硬刚Hive续集」》Hive执行计划 HiveSQL的执行计划描述SQL实际执行的整体轮廓,通过执行计划能了解SQL程序在转换成相应计算引擎的执行逻辑,掌握了执行逻辑也就能更好地把握程序出现的瓶颈点,从而能够实现更有针对性的优化。此外还能帮助开发者识别看似等价的SQL其实是不等价的,看似不等价的SQL其实是等价的SQL。可以说执行计划是打开SQL优化大门的一把钥匙。要想学SQL执行计划,就需要学习查看执行计划的命令:explain,在查询语句的SQL前面加上关键字explain是查看执行计划的基本方法。学会explain,能够给我们工作中使用hive带来极大的便利!查看SQL的执行计划Hive提供的执行计划目前可以查看的信息有以下几种:explain:查看执行计划的基本信息;explaindependency:dependency在explain语句中使用会产生有关计划中输入的额外信息。它显示了输入的各种属性;explainau

  • Go 语言中 channel 内存模型

    内存模型Go内存模型描述的是“在一个groutine中对变量进行读操作能够侦测到在其他gorountine中对改变量的写操作”的条件。happen-before定义Tospecifytherequirementsofreadsandwrites,wedefinehappensbefore,apartialorderontheexecutionofmemoryoperationsinaGoprogram.Ifevente1happensbeforeevente2,thenwesaythate2happensaftere1.Also,ife1doesnothappenbeforee2anddoesnothappenaftere2,thenwesaythate1ande2happenconcurrently.这是HappensBefore的定义,如果e1发生在e2之前,那么我们就说e2发生在e1之后,如果e1既不在e2前,也不在e2之后,那我们就说这俩是并发的.关于channel的happens-before在Go的内存模型中提到了三种情况:case1:对一个channel的发送操作happ

  • 如何在Ubuntu中使用“Avconv”工具记录您的桌面视频和音频

    Libav是一套跨平台的库和用来处理多媒体文件,流和协议的工具,它最初是从FFmpeg的项目分叉。Libav包括许多子工具,如:Avplay:视频和音频播放器。Avconv:一个多媒体转换器以及不同来源的视频和音频记录。Avprobe:连接到多媒体文件流和返回许多有用的信息和关于它的统计信息的工具。Libavfilter:过滤API为不同Libav的工具。在本文中,我们将解释如何使用记录在Debian/Ubuntu的/LinuxMint的发行了“Avconv”计划Linux桌面的视频和音频。第1步:安装Avconv工具1.avconv是从“libav工具”包,这是可以从所有基于Debian的发行版如Ubuntu和薄荷官方软件仓库安装,使用下面的命令的一部分。$sudoapt-getupdate $sudoapt-getinstalllibav-tools复制安装Avconv工具注:从默认的存储库安装包,可能会给你'avconv“工具的年纪大一点的版本。因此,我们建议您从官方git存储库获取最新版本,如下所示。$sudoapt-getinstallyasm $gitcloneg

  • [Jmeter]---JsonPath表达式提取响应&断言

    测试过程中会遇到一些复杂的json响应。比如多层list嵌套时的取值的问题。本篇主要讲述如何运用JsonPath表达式来解决多层嵌套取值的问题。语法参考https://goessner.net/articles/JsonPath/Mock实例https://easy-mock.com/mock/5d5128dd7d20f4574035dc71/example/etc_mock{ "response":[ { "total":4 }, { "location":"Beijing", "detail":{ "area":[ { "date":"2018-06", "city":"北京" } ], "province":"北京", "type":"domestic", "operator":&qu

  • Oracle参数解析(lock_sga)

    前面介绍了Oracle的基本参数,从这节开始讲其他的参数,参数从v$parameter中提取基本参数请看如下链接:http://www.zhaibibei.cn/oralce/oracle-parameter/如无特殊说明数据库版本为11.2lock_sgalock_sga用来将SGA锁定在物理内存中,防止SGA被swap至磁盘参数类型:布尔型默认值:false修改需要重启数据库取值范围:true或false其他在不支持的平台该参数将忽略该参数常和pre_page_sga使配合使用pre_page_sga具体见以前的文章pre_page_sga实际截图:参考连接https://docs.oracle.com/cd/E18283_01/server.112/e17110/initparams118.htm下期参数processor_group_name

  • tomcat9 更换运行模式为 Apr 模式 原

    Tomcat支持三种接收请求的处理方式:BIO、NIO、APR。1.BIO由于每个请求都要创建一个线程来处理,线程开销比较大,不能再高并发的场景,性能也是最低的。 2.NIO是一个基于缓冲区、并能提供非阻塞I/O操作的JavaAPI,比传统的bio更好的并发性能。 3.APR(ApachePortableRun-timelibraries)简单理解,就是从操作系统级别解决异步IO问题,大幅度的提高服务器的处理和响应性能,也是Tomcat运行高并发应用的首选模式。复制所需软件*apr *apr-iconv *apr-util *tomcat-native复制安装软件yuminstall-yapr-developenssl-develgccmakeexpat-devellibtoolcd/usr/local/src wgethttps://mirrors.cnnic.cn/apache/apr/apr-1.6.3.tar.gz tarxfapr-1.6.3.tar.gz cdapr-1.6.3/ ./configure--prefix=/usr/local/apr make&&a

  • StreamingPro 支持Spark Structured Streaming

    前言StructuredStreaming的文章参考这里:Spark2.0StructuredStreaming分析。2.0的时候只是把架子搭建起来了,当时也只支持FileSource(监控目录增量文件),到2.0.2后支持Kafka了,也就进入实用阶段了,目前只支持0.10的Kafka。StructuredStreaming采用dataframeAPI,并且对流式计算重新进行了抽象,个人认为Sparkstreaming更灵活,StructuredStreaming在某些场景则更方便,但是在StreamingPro中他们之间则没太大区别,唯一能够体现出来的是,StructuredStreaming使得checkpoint真的进入实用阶段。下载Spark2.0.2basedonscala-2.10StreamingPro预编译版本假设我们都放在/tmp目录下写逻辑新建一个文件,/tmp/ss-test.json,内容如下:{ "scalamaptojson":{ "desc":"测试", "strategy"

  • 算法模板——哈希单模板字符串匹配

    实现功能:第一行输入模板串;第二行输入N;接下来N行每行一个字符串,将每个字符串中出现的模板串的起始位置找出原理:字符串双值哈希啦啦啦,和KMP其实差不太多,但是字符串双值哈希绝对是个字符串题乱搞神器!!!1constpa=314159;pb=951413; 2var 3i,j,k,l,m,n:longint; 4ap,bp:array[0..100000]ofint64; 5ma,mb,va,vb:int64; 6s1,s2,s3:ansistring; 7begin 8ap[0]:=1;bp[0]:=1; 9fori:=1to100000do 10begin 11ap[i]:=(ap[i-1]*pa)modpb; 12bp[i]:=(bp[i-1]*pb)modpa; 13end; 14readln(s1); 15ma:=0;mb:=0; 16fori:=1tolength(s1)do 17begin 18ma:=(ma+ord(s1[i])*ap[i])modpb; 19mb:=(mb+ord(s1[i])*bp[i])modpa; 20end; 21readln(n); 22f

  • CF293B Distinct Paths 题解

    CF293BDistinctPaths题解题意给定一个n\timesm的矩形色板,有kk种不同的颜料,有些格子已经填上了某种颜色,现在需要将其他格子也填上颜色,使得从左上角到右下角的任意路径经过的格子都不会出现两种及以上相同的颜色。路径只能沿着相邻的格子,且只能向下或者向右。计算所有可能的方案,结果对1000000007(10^9+7)输入及输出格式输入格式第一行,三个整数n,m,k(1\len,m\le1000,1\lek\le10);接下来n行,每行包含m个整数,表示颜色。其中0表示未涂色,非0表示颜色的编号,颜色编号为1到k。输出格式一行,一个整数,表示涂色方案对1000000007(10^9+7)求模的结果。样例此处就不挂了:传送门思路看似数据很大:n,m,k(1\len,m\le1000,1\lek\le10),但是,k<n+m-1n+m-1,因为是只能向下、向右走)。那么实际数据范围很小,大概是n+m-1\le10左右吧。这么小的范围很容易就可想到dfs。这里有两个优化,一个是如果搜到一半,发现剩下的颜色不够用了就直接return。还有一个就是利用颜色A与颜色B的先后

  • 给wordpress评论头像添加alt属性

    给wordpress评论头像添加alt属性作者:matrix被围观:1,718次发布时间:2014-01-16分类:Wordpress|8条评论»这是一个创建于3149天前的主题,其中的信息可能已经有所发展或是发生改变。用百度站长工具的时候看到评论列表的头像没有alt属性,很疑惑。找到wp_list_comments相关函数调用的文件地方,的确是默认没有开启。方法一若硬要有alt的话就得修改WordPress系统文件wp-include/comment-template.php。notepad++打开,查找<?phpif($args['avatar_size']!=0)echoget_avatar($comment,$args['avatar_size']);?>复制将其改为:<?phpif($args['avatar_size']!=0)echoget_avatar($comment,$args['avatar_size'],"","$comment->

  • 项目中每个页面的按钮通常都是要求风格统一的,封装起来可以有效减少重复代码和开发时间

    vue-i18n多语言(国际化)切换初学使用 不少网站有多语言模式,正好项目里需要多语言切换,简单学习之后,整理成文章,加深记忆。 概述 VueI18n是Vue.js的国际化插件,格局比较大,具体怎么解释还是不太好说,直接看用法就能明白。简单说一下为什么叫这个名字:internationalization(i+中间的18个字母+n)。 如果你更喜欢看官方文档可以移步下面的官方文档,本文只是基本使用,看本文你也可以学会基本使用 i18n官网:https://kazupon.github.io/vue-i18n/zh/ 本文案例环境: "vue":"^2.6.11", "vue-i18n":"^8.23.0", 安装 安装vue-I18n插件 //需要使用npm进行安装8.x版本 npminstallvue-i18n@8.23.0 复制 注:如果按照使用时候报一堆错误,找不到变量,可能是i18n版本太高了,与当前VUE版本不兼容,我的项目vue版本是2.6.11,开始我就安装的i18n版本是9.x,一直报错找不到原因,我就试着把i18n版本降低到8.x就不报错了 在项目中

  • Golang学习系列第二天:变量、常量、数据类型和流程语句

          继golang第一天后,今天学习下golang的变量、常量、数据类型和控制流语句。 做过其他编程语言(比如JavaScript,java,python)项目的话,其实很好理解变量、常量、数据类型和控制流。 变量也被称为“变数”,是反映事物运动变化状态的量,比如汇率、房贷利率、贷款利率。 常量也被称“常数”,是反映事物相对静止状态的量,一旦定义,后续不能更改,比如圆周率PI。 Golang是不同于JavaScript和python,但它和java一样,是一种静态类型的编程语言,就是说定义变量或常量前需要声明其类型 1.  变量 1.1 声明一个变量 变量在使用前需要声明,例如 packagemain import"fmt" funcmain(){ varageint//age默认是0 fmt.Printf("我的年龄是:%d岁\n",age) age=99//给age赋值 fmt.Printf("我的年龄是:%d岁",age) }复制 输出如图​ 1.2 自动推导变量类型 也可以

  • 协程的async使用

    async与launch一样都是开启一个协程,但是async会返回一个Deferred对象,该Deferred也是一个job   async函数类似于launch函数.它启动了一个单独的协程,这是一个轻量级的线程并与其它所有的协程一起并发的工作.不同之处在于launch返回一个Job并且不附带任何结果值,而async返回一个Deferred——一个轻量级的非阻塞future,这代表了一个将会在稍后提供结果的promise.你可以使用.await()在一个延期的值上得到它的最终结果,但是Deferred也是一个Job   看一下async的使用: GlobalScope.launch{ vardeffer1=async(Dispatchers.IO){ async1() }.await() vardeffer2=async(Dispatchers.IO){ async2() }.await() valresult=deffer1+deffer2 println("thesumis:$result") } privatesuspendfunasync1():Int{

  • javafx笔记----非javafx线程Platform.runLater赋值不生效情况

    Platform.runLater(()->{ // });复制 Platform.runLater一些情况下没有赋值到fx页面上 采用task方式 Task<SB>task=newTask<SB>(){ @Override publicSBcall()throwsException{ returnnewSB(xxx); } }; task.valueProperty().addListener((obs,oldMessage,a)-> //执行fx页面 ); newThread(task).start();复制   -------------------------------------------------------------------------------------------------------------------------------------------- 作者:Honey_Badger——觉得这文章好,点一下左下角 出处:http://tk55.cnblogs.com/

  • VUE 常规截取和特殊字符之前之后截取

    1:平常使用的 letstr='abcdef'; //0 str=str.slice(0);//返回整个字符串abcdef str=str.substring(0);//返回整个字符串abcdef str=str.substr(0);//返回整个字符串abcdef //使用一个参数 str=str.slice(2);//截取第二个之后所有的字符cdef str=str.substring(2);//截取第二个之后所有的字符cdef str=str.substr(2);//截取第二个之后所有的字符cdef //使用两个参数 str=str.slice(2,4);//截取第二个到第四个之间的字符cd str=str.substring(2,4);//截取第二个到第四个之间的字符cd str=str.substr(2,4);//截取从第3个开始往后数4位之间的字符cdef //使用两个负数 str=str.slice(1,-3);//截取第二个到第四个之间的字符bc str=str.substring(1,-3);//截取第二个到第四个之间的字符a#负数转换为0 str=str.sub

  • 页面优化

      年前辞职了,最近一直在面试,博客有点荒废了,实在不应该。最近面试了大大小小的很多家公司,面试的多了,总会有一些经验,在这里和大家分享一下关于面试中面试官问的比较多的问题。   题目是:如何优化能够提高浏览器的加载速度。   我去面试的每一家公司都或多或少问到了我这个问题,现在写代码不能只顾自己写的爽不爽了,一定要有良好的写代码的习惯,要有一定的可维护性,可拓展性,并且注重用户体验,这样写出来的代码才能成为是高质量的代码,那么我们如何进行优化,才能提高浏览器的加载速度呢?以下是我根据自己的经验进行的一些总结。   1.我们熟悉的预加载以及懒加载     预加载可以让在加载页面之前做一些简单的处理,可以优化用户的视觉效果以及体验。     懒加载能够让浏览器在加载的时候只加载,整个屏幕部分,也就是用户能够看到的部分。用户向滑动滚轮滑动到指定位置,再加载特定资源。   2.css文件先拆分,再合并。     这里拆分是指在开发周期内,为了方便项目维护和代码统一管理,应该把不同功能和模块的代码分开保存,这样后期维护可以快速定位,快速解决,而且能做到分工明确。     合并是指上线之前使用工

  • 手写koa-static源码,深入理解静态服务器原理

    这篇文章继续前面的Koa源码系列,这个系列已经有两篇文章了: 第一篇讲解了Koa的核心架构和源码:手写Koa.js源码 第二篇讲解了@koa/router的架构和源码:手写@koa/router源码 本文会接着讲一个常用的中间件----koa-static,这个中间件是用来搭建静态服务器的。 其实在我之前使用Node.js原生API写一个web服务器已经讲过怎么返回一个静态文件了,代码虽然比较丑,基本流程还是差不多的: 通过请求路径取出正确的文件地址 通过地址获取对应的文件 使用Node.js的API返回对应的文件,并设置相应的header koa-static的代码更通用,更优雅,而且对大文件有更好的支持,下面我们来看看他是怎么做的吧。本文还是采用一贯套路,先看一下他的基本用法,然后从基本用法入手去读源码,并手写一个简化版的源码来替换他。 本文可运行代码已经上传GitHub,大家可以拿下来玩玩:https://github.com/dennis-jiang/Front-End-Knowledges/tree/master/Examples/Node.js/KoaStatic

  • 刻意练习-读书心得

    刻意练习这本书我让我体会最深的是3F原则与成为杰出人物的四个阶段。图为我手工绘制的思维导图。 什么是3F原则:专注、反馈、遇到问题改进。 大家刻意把图片放大来看。  

相关推荐

推荐阅读