链表反转的两种实现方法,后一种击败了100%的用户
作者 | 王磊
来源 | Java中文社群(ID:javacn666)
头图 | CSDN 下载自东方IC
链表反转是一道很基础但又非常热门的算法面试题,它也在《剑指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 的实现方式是利用了栈后进先出的特性可以直接对链表进行反转,实现思路和实现代码都比较简单,但在性能和内存消耗方面都不是很理想,可以作为笔试的保底实现方案;而递归的方式在性能和内存消耗方面都有良好的表现,同时它的实现代码也很简洁,读者只需理解代码实现的思路即可。
更多精彩推荐
☞1024程序员节重要议程曝光,开源技术英雄会聊开源“真心话”
☞“国产操作系统最大难题在于解决「生产关系」” | 人物志
☞“我们的目标是取代物联网中的安卓” | 人物志
☞对话阿里云:开源与自研如何共处?☞AI 还原康乾盛世三代皇帝的样貌,简直太太太好玩了!☞观点 | 回顾以太坊近期及中期扩容路线图,展望 rollup 作为中心的以太坊路线图
点分享点点赞点在看
链表反转的两种实现方法,后一种击败了100%的用户相关推荐
- python爬虫详细步骤-Python爬虫的两套解析方法和四种爬虫实现过程
对于大多数朋友而言,爬虫绝对是学习 python 的最好的起手和入门方式.因为爬虫思维模式固定,编程模式也相对简单,一般在细节处理上积累一些经验都可以成功入门.本文想针对某一网页对 python 基础 ...
- 队列实现栈的3种方法,全都击败了100%的用户!
作者 | 王磊 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) 本文已收录至 Github<小白学算法>系列:https://gith ...
- 链表反转的两种实现方法,后一种击败了100%的用户!
作者 | 王磊 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) 链表反转是一道很基础但又非常热门的算法面试题,它也在<剑指Offer> ...
- 链表反转的两种实现方法
#include <iostream> using namespace std; //元结点 struct Node { int data; Node *next; }; ...
- 测试案例6种编写方法_一种编写测试的好方法
测试案例6种编写方法 测试. 我最近一直在考虑测试. 作为我对各种项目所做的代码审查的一部分,我已经看到了数千行未经测试的代码. 这不仅是测试覆盖率统计数据指出这一点的情况,更是该项目中根本没有任何测 ...
- php 有几种打印方法,php 5种打印方式及变量类型,
php 5种打印方式及变量类型五种打印方法和可变类型的PHP, PHP 打印的5种类型 echo 直接打印,无返回值.Echo一次可以打印多个字符串,print只能打印一个字符串.回声打印数据比打印速 ...
- Java开发自学技巧!链表反转的两种实现方法,太香了
导语 回首向来萧瑟处,归去,也无风雨也无晴. 我一哥们也是做Java开发,暂且先叫他峰哥吧,到今年已经入行6年了,每天还是写一些业务代码,至今还是个单身狗,愁的头发真的都快谢顶了. 虽然峰哥每天做着C ...
- 链表反转的两种思路及算法
这样的思路用代码实现主要是有四行(具体内容懒得写了,作为一只摸鱼王),核心四行在就可 //做一个自定义函数,如link *turnlink,加一个for循环,进行如下四行 lm->next=lm ...
- java 文件写入 读取_JAVA文件的两种读取方法和三种写入方法
在使用java对文件进行读写操作时,有多种方法可以使用,但不同的方法有不同的性能. 此文对常用的读写方法进行了整理,以备不时之需. 1.文件的读取 主要介绍两种常用的读取方法.按行读取和按字符块读取. ...
最新文章
- Google团队在DNN的实际应用方式的整理
- DataFrame(8):DataFrame运算——逻辑运算(用于筛选数据) 含有~
- 什么软件测试身高体重标准,测测你的身高体重指数(BMI)正常吗?
- java学习文档_资深程序员带你深入了解JAVA知识点,实战篇,PDF文档
- mysql第五章 在线测试_PHP+MySQL来实现在线测试quiz功能
- AI落地谁最强?AI Top 30+案例评选等你来秀
- Makefile学习(三)[第二版]
- 单单表单独占一行_聊一聊 Excel 数据透视表的 4 种布局选项
- 用cmd命令简单创建oracle 数据库、用户和表空间
- Serializable 接口与 Java 序列化与反序列化
- webstorm使用指南
- ACE Admin 模板实现sidebar菜单联动tabs页签
- 硬件选型之如何看光耦器件的开关频率
- 初学linux用哪个发行版本,初学者学习Linux选择哪个发行版本合适?
- 二级c语言培训资料,全国计算机二级考试C语言,培训资料.doc
- java响铃_android 闹铃(响铃、震动)
- AC7811-FOC无感控制代码详解
- win10运行bat脚本,提示Permission denied
- vtx文件有什么用_VTX文件扩展名 - 什么是.vtx以及如何打开? - ReviverSoft
- windows下安装yii2
热门文章
- 算法不会,尚能饭否之排序——直接插入排序(Insert sort)
- 【算法设计】最大子段和问题解析(对应算法第三题)
- 十二 Spring的AOP开发入门,整合Junit单元测试(AspectJ的XML方式)
- TODO maven学习笔记
- Mysql:语法:虚拟表DUAL
- 自定义QListWidget实现item被hover时改变图标样式(模仿网易云音乐选项列表)(方法一)
- 论文阅读:U2 Net: Going Deeper with Nested U-Structure for Salient Object Detection
- python38pip装不了东西_python – pip不能安装任何东西
- 数据结构实验之图论九:最小生成树
- leetcode python3 简单题9. Palindrome Number