作者 | 王磊

来源 | 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 竟然是这样实现栈的?

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

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

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

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

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

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

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

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

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

    作者 | 王磊 来源 | Java中文社群(ID:javacn666) 头图 |  CSDN 下载自东方IC 链表反转是一道很基础但又非常热门的算法面试题,它也在<剑指Offer>的第 2 ...

  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. 基于GUI的mcc编译和dll生成
  2. 关于申请由中国自动化学会主办“全国大学生智能汽车竞赛”的回函
  3. 智能优化算法之蚁群算法(1)
  4. php证券k线图,php画K线图的一个工具
  5. 最轻量级的C协程库:Protothreads
  6. Linux要学git吗,git学习一 基于linux ubuntu git安装与配置
  7. Java讲课笔记17:Lambda表达式
  8. 【9603】最大整数
  9. 王思聪连收3条限制消费令后,债主回应:对于他是小钱,对于我们可是巨款
  10. php首字母 大写 数组去重复
  11. ASP.NET MVC 1.0 学习笔记(随时更新)
  12. 如何提高大数据分析的效果
  13. 编译器错误信息: CS1010: 常数中有换行符
  14. [模板]匈牙利算法(二分图匹配)
  15. android平板电脑 刷机工具,安卓平板电脑刷机教程之一键刷机.pdf
  16. UE4 碰撞射线检测
  17. Trunk详解(笔记)
  18. 牛客练习赛63 B 牛牛的鱼缸
  19. 如何换ionic里面的图标
  20. chdir、fchdir 和 getcwd 函数

热门文章

  1. Linux namespace之:network namespace
  2. 【线段树】Segment Tree
  3. Spring Data Redis实战之提供RedisTemplate
  4. TOP命令监视系统任务及掩码umask的作用
  5. 《APUE》第6章笔记
  6. ORA-29702:error occurred in Cluster Group Service operation错误解决
  7. BENET上海分公司网络改造项目设计实施方案(S1项目实践)
  8. linux java -xms_为什么JVM比指定的-Xms消耗更少的内存?
  9. java 顺序栈_Java实现顺序栈
  10. 隐藏域input里面放当前时间_【小A问答】Win10的隐藏小秘密,被我发现了!