学算法,刷力扣,加油卷,进大厂!

题目描述

力扣题目链接

给你单链表的头节点 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

涉及算法

  • 链表是由节点组成的,在链表的每个节点中,由两部分组成,即数据域(存放数据)和指针域(指向下一个节点的指针);
  • 链表不能像数组一样可以直接定位元素位置,因此它的查找比较慢;
  • 双指针: pre 和 cur ;pre 在前 cur 在后;通过双指针可以实现链表的局部反转;

那么根据题目我们可以提炼出的关键点:

  • 已知单链表的头节点 head
  • 实现链表的反转

解决这道题目呢,可以通过新建一个链表来实现链表元素的反转,但是这样的话,会造成内存空间的浪费;所以可以通过就地反转的方式。因为这是链表,所以只需要改变链表的next指针的方向就可以了。

题目解答

Java解法一

使用双指针的方法

  • 首先定义两个指针,命名为cur(进行反转的当前节点)和pre(进行反转的前一个节点);
  • 每次让 pre 的 next 指向 cur ,实现一次局部反转,完成之后,pre 和 cur 同时往前移动一个位置;
  • 重复上步操作,直到cur指针指向NULL,这时候链表反转完成;

返回节点不再是head了,而是pre指针,因为此时pre指向了新的头节点

根据以上分析,实现代码如下:

class Solution {//双指针方法public ListNode reverseList(ListNode head) {ListNode temp; //临时节点,用来实现节点反转,防止断链ListNode cur = head; //进行反转的当前节点(与它前一个节点交换,初始为头结点)ListNode pre = null; //进行反转的前一个节点(与它的后一个节点进行交换,初始为null)//循环(每次两个的反转)(//cur为null的时候意味着反转到链尾了)while(cur != null){ temp = cur.next; //当前节点的下一个节点,防止断链cur.next = pre; //反转操作//更新节点指针pre = cur; cur = temp;}return pre;//返回结果}
}

Java解法二

使用递归的方法
递归方法相对于双指针是更加抽象的,不容易理解。

  • 首先是链表递归至链尾;
  • 然后开始链表指针的反转;
  • 每次在返回时,让当前结点的 next的next 指针指向当前节点,当前结点的 next指针指向 null;
  • 直至全部反转完成,返回结果

根据以上分析,实现代码如下:

class Solution {//使用递归的方法public ListNode reverseList(ListNode head) {//null或者只有一个元素,直接返回if (head == null || head.next == null) {return head;}//递归调用(一直到链尾)ListNode result = reverseList(head.next);//开始从链尾向前的反转指针//每次在返回时,让当前结点的 next的next 指针指向当前节点head.next.next = head;//当前结点的 next指针指向 nullhead.next = null;//反转完成return result;}
}

卷进大厂系列之LeetCode刷题笔记:反转链表(简单)相关推荐

  1. 卷进大厂系列之LeetCode刷题笔记:二分查找(简单)

    LeetCode刷题笔记:二分查找(简单) 学算法,刷力扣,加油卷,进大厂! 题目描述 涉及算法 题目解答 学算法,刷力扣,加油卷,进大厂! 题目描述 力扣题目链接 给定一个 n 个元素有序的(升序) ...

  2. 卷进大厂系列之LeetCode刷题笔记:设计链表(中等)

    学算法,刷力扣,加油卷,进大厂! 题目描述 力扣题目链接 设计链表的实现.您可以选择使用单链表或双链表.单链表中的节点应该具有两个属性:val 和 next.val 是当前节点的值,next 是指向下 ...

  3. 卷进大厂系列之LeetCode刷题笔记:移除链表元素(简单)

    学算法,刷力扣,加油卷,进大厂! 题目描述 力扣题目链接 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回新的头节点 . 示 ...

  4. 卷进大厂系列之LeetCode刷题笔记:长度最小的子数组(中等)

    学算法,刷力扣,加油卷,进大厂! 题目描述 力扣题目链接 给定一个含有 n 个正整数的数组和一个正整数 target . 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl ...

  5. 卷进大厂系列之LeetCode刷题笔记:移除元素(简单)

    学算法,刷力扣,加油卷,进大厂! 题目描述 力扣题目链接 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度. 不要使用额外的数组空间, ...

  6. leetcode刷题:反转链表I

    1.题目 分析: 代码如下: //迭代反转法,head 为无头节点链表的头指针 link * iteration_reverse(link* head) {if (head == NULL || he ...

  7. LeetCode刷题笔记2——数组2

    LeetCode刷题笔记2--数组2 重塑数组 题目 在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原 ...

  8. 小何同学的leetcode刷题笔记 基础篇(01)整数反转

    小何同学的leetcode刷题笔记 基础篇(01)整数反转[07] *** [01]数学取余法*** 对数字进行数位操作时,常见的方法便是用取余的方法提取出各位数字,再进行操作 操作(1):对10取余 ...

  9. LeetCode刷题笔记汇总

    LeetCode刷题笔记汇总 第一次刷LeetCode写的一些笔记. 1.两数之和 3.无重复字符的最长子串 15.三数之和 18.四数之和 19.删除链表的倒数第 N 个结点 20.有效的括号 21 ...

最新文章

  1. 机器学习之挖掘melb_data.csv数据
  2. One Class SVM 对于样本不均衡处理思路——拿出白样本建模,算出outlier,然后用黑去检验效果...
  3. Ajax--readyState一直为0
  4. [python] Kmeans文本聚类算法+PAC降维+Matplotlib显示聚类图像
  5. 登录及注册模块设置与流程图
  6. 完全硬件实现的忆阻器卷积神经网络
  7. 看完这篇还不知道css固定和自适应可以小和尚要摆地摊了
  8. android关机背景,鍵盤消失后的Android白色背景
  9. excel批量更改超链接_批量新建Excel指定名称工作表并设置超链接!你,学会了吗?...
  10. 9-8 更新 - 2017 Citrix partner webinar PPT及在线观看地址
  11. 代码优化能减少多少运行速度_35 个小细节,提升 Java 代码的运行效率!你知道几个?...
  12. windows server2008 安装iscsi服务
  13. 手游发展迅猛,渠道要搭建移动游戏生态圈才有出路
  14. python 3 12306余票查询脚本
  15. 读《大学生上课为什么一定要认真听讲》有感
  16. 贷还是不贷:如何用 Python 和机器学习帮你决策?
  17. cc许可_免费的公共领域和CC0许可图片的16个来源
  18. 07-PDI(Kettle)源码编译8.2.0.0.R版本
  19. 如何进行架构技术选型
  20. 【NI Multisim 14.0原理图设计基础——元器件分类】

热门文章

  1. 用行为级描述方式实现一个加法器电路(基于ISE的设计)(2输入1位全加器电路)
  2. python字典键操作
  3. Twilio能够在市场低谷成功上市,为什么以及有什么意义?
  4. 50个查询系列-第二个查询
  5. 使用pxe来实现无人值守linux
  6. 谈asp.net解决方案的项目生成时的输出路径
  7. Sql Server使用链接服务器远程取数据!
  8. Windows XP下如何设置电脑定时关机
  9. matplotlib画图中文显示问题
  10. 如果函数是可以遗传的