作者 | 王磊

来源 | 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%的用户相关推荐

  1. python爬虫详细步骤-Python爬虫的两套解析方法和四种爬虫实现过程

    对于大多数朋友而言,爬虫绝对是学习 python 的最好的起手和入门方式.因为爬虫思维模式固定,编程模式也相对简单,一般在细节处理上积累一些经验都可以成功入门.本文想针对某一网页对 python 基础 ...

  2. 队列实现栈的3种方法,全都击败了100%的用户!

    作者 | 王磊 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) 本文已收录至 Github<小白学算法>系列:https://gith ...

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

    作者 | 王磊 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) 链表反转是一道很基础但又非常热门的算法面试题,它也在<剑指Offer> ...

  4. 链表反转的两种实现方法

    #include <iostream> using namespace std; //元结点 struct Node {     int data;     Node *next; }; ...

  5. 测试案例6种编写方法_一种编写测试的好方法

    测试案例6种编写方法 测试. 我最近一直在考虑测试. 作为我对各种项目所做的代码审查的一部分,我已经看到了数千行未经测试的代码. 这不仅是测试覆盖率统计数据指出这一点的情况,更是该项目中根本没有任何测 ...

  6. php 有几种打印方法,php 5种打印方式及变量类型,

    php 5种打印方式及变量类型五种打印方法和可变类型的PHP, PHP 打印的5种类型 echo 直接打印,无返回值.Echo一次可以打印多个字符串,print只能打印一个字符串.回声打印数据比打印速 ...

  7. Java开发自学技巧!链表反转的两种实现方法,太香了

    导语 回首向来萧瑟处,归去,也无风雨也无晴. 我一哥们也是做Java开发,暂且先叫他峰哥吧,到今年已经入行6年了,每天还是写一些业务代码,至今还是个单身狗,愁的头发真的都快谢顶了. 虽然峰哥每天做着C ...

  8. 链表反转的两种思路及算法

    这样的思路用代码实现主要是有四行(具体内容懒得写了,作为一只摸鱼王),核心四行在就可 //做一个自定义函数,如link *turnlink,加一个for循环,进行如下四行 lm->next=lm ...

  9. java 文件写入 读取_JAVA文件的两种读取方法和三种写入方法

    在使用java对文件进行读写操作时,有多种方法可以使用,但不同的方法有不同的性能. 此文对常用的读写方法进行了整理,以备不时之需. 1.文件的读取 主要介绍两种常用的读取方法.按行读取和按字符块读取. ...

最新文章

  1. Google团队在DNN的实际应用方式的整理
  2. DataFrame(8):DataFrame运算——逻辑运算(用于筛选数据) 含有~
  3. 什么软件测试身高体重标准,测测你的身高体重指数(BMI)正常吗?
  4. java学习文档_资深程序员带你深入了解JAVA知识点,实战篇,PDF文档
  5. mysql第五章 在线测试_PHP+MySQL来实现在线测试quiz功能
  6. AI落地谁最强?AI Top 30+案例评选等你来秀
  7. Makefile学习(三)[第二版]
  8. 单单表单独占一行_聊一聊 Excel 数据透视表的 4 种布局选项
  9. 用cmd命令简单创建oracle 数据库、用户和表空间
  10. Serializable 接口与 Java 序列化与反序列化
  11. webstorm使用指南
  12. ACE Admin 模板实现sidebar菜单联动tabs页签
  13. 硬件选型之如何看光耦器件的开关频率
  14. 初学linux用哪个发行版本,初学者学习Linux选择哪个发行版本合适?
  15. 二级c语言培训资料,全国计算机二级考试C语言,培训资料.doc
  16. java响铃_android 闹铃(响铃、震动)
  17. AC7811-FOC无感控制代码详解
  18. win10运行bat脚本,提示Permission denied
  19. vtx文件有什么用_VTX文件扩展名 - 什么是.vtx以及如何打开? - ReviverSoft
  20. windows下安装yii2

热门文章

  1. 算法不会,尚能饭否之排序——直接插入排序(Insert sort)
  2. 【算法设计】最大子段和问题解析(对应算法第三题)
  3. 十二 Spring的AOP开发入门,整合Junit单元测试(AspectJ的XML方式)
  4. TODO maven学习笔记
  5. Mysql:语法:虚拟表DUAL
  6. 自定义QListWidget实现item被hover时改变图标样式(模仿网易云音乐选项列表)(方法一)
  7. 论文阅读:U2 Net: Going Deeper with Nested U-Structure for Salient Object Detection
  8. python38pip装不了东西_python – pip不能安装任何东西
  9. 数据结构实验之图论九:最小生成树
  10. leetcode python3 简单题9. Palindrome Number