链表反转的两种实现方法,后一种击败了100%的用户!

作者 | 王磊

来源 | Java中文社群(ID:javacn666)

转载请联系授权(微信ID:GG_Stone)

链表反转是一道很基础但又非常热门的算法面试题,它也在《剑指Offer》的第 24 道题出现过,至于它有多热(门)看下面的榜单就知道了。

从牛客网的数据来看,链表反转的面试题分别霸占了【上周考过】和【研发最爱考】的双重榜单,像网易、字节等知名互联网公司都考过,但通过率却低的只有 30%,所以本文我们就来学习一下反转链表的两种实现方法。

排行榜数据:https://www.nowcoder.com/activity/oj

题目

标题:剑指 Offer 24. 反转链表

描述:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

示例:

输入: 1->2->3->4->5->NULL

输出: 5->4->3->2->1->NULL

LeetCode 链接:https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof/

实现方式一:Stack


全部入栈:

因为栈是先进后出的数据结构,因此它的执行过程如下图所示:

最终的执行结果如下图所示:

实现代码如下所示:

public ListNode reverseList(ListNode head) {if (head == null) return null;Stack<ListNode> stack = new Stack<>();stack.push(head); // 存入第一个节点while (head.next != null) {stack.push(head.next); // 存入其他节点head = head.next; // 指针移动的下一位}// 反转链表ListNode listNode = stack.pop(); // 反转第一个元素ListNode lastNode = listNode; // 临时节点,在下面的 while 中记录上一个节点while (!stack.isEmpty()) {ListNode item = stack.pop(); // 当前节点lastNode.next = item;lastNode = item;}lastNode.next = null; // 最后一个节点赋为null(不然会造成死循环)return listNode;
}

LeetCode 验证结果如下图所示:

实现方式二:递归

实现代码如下所示:

public static ListNode reverseList(ListNode head) {if (head == null || head.next == null) return head;// 从下一个节点开始递归ListNode reverse = reverseList(head.next);head.next.next = head; // 设置下一个节点的 next 为当前节点head.next = null; // 把当前节点的 next 赋值为 null,避免循环引用return reverse;
}

LeetCode 验证结果如下图所示:

总结

本文我们分别使用了 Stack 和递归的方法实现了链表反转的功能,其中 Stack 的实现方式是利用了栈后进先出的特性可以直接对链表进行反转,实现思路和实现代码都比较简单,但在性能和内存消耗方面都不是很理想,可以作为笔试的保底实现方案;而递归的方式在性能和内存消耗方面都有良好的表现,同时它的实现代码也很简洁,读者只需理解代码实现的思路即可。


往期推荐

JDK 竟然是这样实现栈的?


动图演示:手撸堆栈的两种实现方法!


漫画:什么是红黑树?(整合版)

关注下方二维码,收获更多干货!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/545794.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++总结篇(4)内存管理

C语言中用malloc/realloc/calloc/free进行空间的申请与释放&#xff0c;在C中用新的方式进行空间的申请与释放。 申请一个int型的空间并释放 //C语言&#xff1a;int *ptr(int)malloc(sizeof(int));free(ptr); //C: int *ptr new int;delete ptr; C的申请方式更为简洁方便&…

debug和release的区别

1。Debug和Release有什么区别&#xff0c;为什么要使用Release版本&#xff01; 2。怎么把Debug转成ReleaseDebug版本包括调试信息&#xff0c;所以要比Release版本大很多&#xff08;可能大数百K至 数M&#xff09;。至于是否需要DLL支持&#xff0c;主要看你采用的编译选项。…

人工智能ai 学习_人工智能中学习代理的要素

人工智能ai 学习As already discussed, the Learning agents have the capability to improve their knowledge base by Learning from their surroundings by themselves, without any help or input from the user or the client. 如已经讨论的那样&#xff0c; 学习代理可以…

squid代理服务器(捎带的SNAT)

1.传统代理传统代理可以隐藏IP地址 多用于Internet 在Linux中 默认没有安装squid 所以要安装 在red hat中 还要安装perl 语言包的支持 squid代理服务器需要两块网卡 首先保证你的流量是从linux服务器上过的 所以先保证做完SNAT可以互相通信1&#xff09;配置网络参数在试验中一…

MySQL开源工具推荐,有了它我卸了珍藏多年Nactive!

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;最近无意间发现了一款开源免费的 MySQL 客户端管理工具&#xff0c;磊哥试用了两天感觉还行&#xff0c;所以今天推荐给各位…

C++总结篇(3)String类

string是表示字符串的字符串类&#xff0c;该类的接口与常规容器的接口基本相同&#xff0c;再添加了一些专门用来操作string的常规操作。string在底层实际是&#xff1a;basic_string模板类的别名&#xff0c;typedef basic_string<char, char_traits, allocator> strin…

memoryTraining记忆训练小游戏

无聊的时候用C写了一个记忆训练的小游戏、、、 灵感源于一个flash的小游戏学到C语言就用C语言实验了一下&#xff0c;做出来。好久以前的东西了&#xff0c;数组用的还不咋样&#xff0c;现在看看把数组下标0漏掉了、、、掉了修补了修补&#xff0c;先扔这儿吧。源码下载

动态调用动态库方法 .so

2019独角兽企业重金招聘Python工程师标准>>> 关于动态调用动态库方法说明 一、 动态库概述 1、 动态库的概念 日常编程中&#xff0c;常有一些函数不需要进行编译或者可以在多个文件中使用&#xff08;如数据库输入/输 出操作或屏幕控制等标准任务函数&#…

C++总结篇(5)vector

vector是表示可变大小数组的序列容器。就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素 进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大小是可以动态改变的&#xff0c;而且它的大小会被容器自…

清除缓存 c语言_如何用C语言设置,清除和切换单个位?

清除缓存 c语言Given a number and we have to 1) set a bit, 2) clear a bit and 3) toggle a bit. 给定一个数字&#xff0c;我们必须1)设置一个位&#xff0c;2)清除一个位&#xff0c;3)切换一个位。 1)设置一点 (1) Setting a bit) To set a particular bit of a number,…

算法图解:如何找出栈中的最小值?

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;前面我们学习了很多关于栈的知识&#xff0c;比如《动图演示&#xff1a;手撸堆栈的两种实现方法&#xff01;》和《JDK 竟然…

数据库概况

New Words & Expressions:facilitate 使容易&#xff0c;促进retrieval n. 检索field n. 字段record 记录&#xff0c;alphabetically 按字母顺序地chronologically 按年代顺序排break down v. 分解build up 建造&#xff0c;装配&#xff0c;组成encyclopedia n. 百科全书…

30岁之前需要知道的10个人生底线,你知道几个?

http://blog.csdn.net/wojiushiwo987/article/details/8893302 引导语&#xff1a;现在的这些年轻人&#xff0c;你是否考虑过你人生成长发展风向与目标&#xff0c;一旦追求和愿望受阻后&#xff0c;你会如何思考对应&#xff0c;分析其原因的所在&#xff0c;你该如何面对去做…

用C语言设置程序开机自启动

当需要使某一程序在开机时就启动它&#xff0c;需要把它写进注册表的启动项中。 下面就展示一种简单的写法&#xff1a; #include <windows.h> #include <stdlib.h> #include <stdio.h>void ComputerStart(char *pathName) {//找到系统的启动项 char *szSub…

漫画:什么是布隆算法?

两周之前——爬虫的原理就不细说了&#xff0c;无非是通过种子URL来顺藤摸瓜&#xff0c;爬取出网站关联的所有的子网页&#xff0c;存入自己的网页库当中。但是&#xff0c;这其中涉及到一个小小的问题......URL去重方案第一版&#xff1a;HashSet创建一个HashSet集合&#xf…

kotlin 字符串_Kotlin程序确定字符串是否具有所有唯一字符

kotlin 字符串Given a string, we have to check whether it has all unique characters or not. 给定一个字符串&#xff0c;我们必须检查它是否具有所有唯一字符。 Example: 例&#xff1a; Input:string "includehelp"Output:falseInput:string "abcd&qu…

css优先级机制说明

首先说明下样式的优先级,样式有三种&#xff1a; 1. 外部样式&#xff08;External style sheet&#xff09; 示例&#xff1a; <!-- 外部样式 bootstrap.min.css --><link href"css/bootstrap.min.css" rel"stylesheet" type"text/css"…

制作一个钟表

用EasyX制作的一个简易钟表&#xff0c;需设置字符集属性为多字节字符集。效果如下所示&#xff1a; GIF图会有些闪动&#xff0c;在实际中这种闪动几乎不可见。 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<graphics.h> #include<math.h…

趣谈MySQL历史,以及MariaDB初体验

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;MySQL 是一个跨世纪的伟大产品&#xff0c;它最早诞生于 1979 年&#xff0c;距今已经有 40 多年的历史了&#xff0c;而如今…

网页设置页数/总页数_图书分配问题(分配最小页数)

网页设置页数/总页数Problem statement: 问题陈述&#xff1a; Given an array of integers A of size N and an integer B. College library has N bags, the ith book has A[i] number of pages. 给定一个大小为N的整数A和一个整数B的数组。 高校图书馆有N个书包&#xff0c…