剑指 Offer II 024. 反转链表(经典题型)

这篇具有很好参考价值的文章主要介绍了剑指 Offer II 024. 反转链表(经典题型)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

时间是伟大的作者,她能写出未来的结局。                               ——卓别林

目录

题目描述:

方法1:迭代法(翻指针)

方法2:头插法 

方法3:递归法 

题目描述:

给定单链表的头节点 head ,请反转链表,并返回反转后的链表的头节点

示例 1:

剑指 Offer II 024. 反转链表(经典题型)


输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

示例 2:

剑指 Offer II 024. 反转链表(经典题型)


输入:head = [1,2]
输出:[2,1]

示例 3:
输入:head = []
输出:[]

方法1:迭代法(翻指针)

迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法(或者称为一次解法),即一次性解决问题。和循环其实和像,都有结束的条件。
这里就要用到我们之前学习的双指针的方法。假如要反转的数字是 1 2 3。

 

剑指 Offer II 024. 反转链表(经典题型)

但是这样写又存在很大的问题,在第二次反转指针的时候,n2和n2的下一个结点失去了连续,下次就找不到n2的下一个结点了,所以我们还要设置一个变量来保存n2的下一个结点。

改进: 

剑指 Offer II 024. 反转链表(经典题型)

有了上面的思路,我们就可以写代码了。

struct ListNode* reverseList(struct ListNode* head)
{
   if(head==NULL)
     return NULL;
    struct ListNode*n1=NULL,*n2=head,*n3=head->next;
    while(n2)
    {
        n2->next=n1;//这里就是反转指针
        n1=n2;
        n2=n3;
        if(n3)//当n3为空的时候,就不能使用n3->next,所以这里一定要判断
        n3=n3->next;
    }
      return n1;//结束n1为头指针,返回头指针
}

时间复杂度O(N)。空间复杂度O(1)。

方法2:头插法 

头插法也就是我们学习单链表那样,在链表的头结点上面插入数据。这里我们就要先设置一个NULL的头结点,再把原链表的结点一个一个取下来,再链接到NULL的头上面再把头结点改为新链接上去的结点。
剑指 Offer II 024. 反转链表(经典题型)
这题同样会使用到双指针。可见双指针问题还是非常实用的,一定要学会。 

struct ListNode* reverseList(struct ListNode* head)
{
   struct ListNode*cur=head;
   struct ListNode*next=NULL;
   struct ListNode*newhead=NULL;
       while(cur)
       {
           next=cur->next;
           cur->next=newhead;//头插
           newhead=cur;//头结点被重新赋值
           cur=next;
       }
       return newhead;
}

时间复杂度O(N)。空间复杂度O(1)。

方法3:递归法 

递归简单来说就是在运行过程中不断调用自己,直到碰到终止条件,返回结果的过程。
剑指 Offer II 024. 反转链表(经典题型)
对于递归法可能不太好理解,我自己也看了很久,不知道讲的对不对。如果讲错了,还望各位老铁能够指证。对于递归法,我们先把代码放处理啊,再通过一步一步的画图,好好地理解递归的奥妙。 

struct ListNode* reverseList(struct ListNode* head)
{
     if(head==NULL||head->next==NULL)
     return head;
     struct ListNode*newhead=reverseList(head->next);
     head->next->next=head;
     head->next=NULL;
     return newhead;
}

 对于这个代码还是比较好理解的,当链表为空时,直接返回head,也就是NULL。当链表的下一个结点为空的时候,也就是链表只有一个结点,所以我们也是返回head。

if(head==NULL||head->next==NULL)
     return head;

假设要反转的数字是 1  2  3  4  5。
剑指 Offer II 024. 反转链表(经典题型)
 

第一次递归:即执行下面的语句。
剑指 Offer II 024. 反转链表(经典题型) 

虽然说递归的代码简洁,但是不怎么好理解,空间复杂度也为O(N)。 所以还是建议使用双指针的做法,这个方法一定要知道。文章来源地址https://www.toymoban.com/news/detail-408566.html

到了这里,关于剑指 Offer II 024. 反转链表(经典题型)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • leetcode 剑指 Offer II 091. 粉刷房子

    题目链接:leetcode 剑指 Offer II 091 假如有一排房子,共 n 个,每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。 当然,因为市场上不同颜色油漆的价格不同,所以房子粉刷成不同颜色的花费成本也

    2024年02月11日
    浏览(29)
  • Leetcode 剑指 Offer II 038. 每日温度

    题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 请根据每日 气温 列表 temperatures ,重新生成一个列表,要求其对应位置的输出为:要想观测到更高的

    2024年02月14日
    浏览(35)
  • (贪心) 剑指 Offer 14- II. 剪绳子 II ——【Leetcode每日一题】

    难度:中等 给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段( m 、 n 都是整数, n 1 并且 m 1 ),每段绳子的长度记为 k[0],k[1]...k[m - 1] 。请问 k[0]*k[1]*...*k[m - 1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最

    2024年02月13日
    浏览(35)
  • 替换空格&&反转字符串中的单词(LeetCode 剑指offer05 && 151)

    题目 剑指 Offer 05. 替换空格  思路 遍历,使用新的字符串来接原字符串,如为空格,则加入%20,否则加入原字符串。  不过看了题解有另一种解法,由于空格转化为%20,设计到原字符存储空间的增加,因此先计算出需要增加的空间后。再使用双指针,从后往前遍历,这里画的

    2024年02月16日
    浏览(31)
  • 【LeetCode】每日一题:链表部分经典题型

    ​👻内容专栏:《LeetCode刷题专栏》 🐨本文概括: 归纳链表部分经典题型 。 206.反转链表 、 876.链表的中间节点 、 21.合并两个有序链表 、 160.相交链表 、 141.环形链表 、 142.环形链表Ⅱ 🐼本文作者:花 碟 🐸发布时间:2023.5.17 👉 206.反转链表 题目描述:给你单链表的头

    2024年02月05日
    浏览(23)
  • 剑指 Offer II 010. 和为 k 的子数组

    给定一个整数数组和一个整数 k ,请找到该数组中和为 k 的连续子数组的个数。 示例 1: 示例 2: 提示: 这个题目做出来不难,直接暴力枚举。但是利用哈希表和前缀和优化的过程我一直不是很理解,所以写下这篇文章来一点一点的研究,希望能对大家有所帮助 首先,先看最

    2023年04月16日
    浏览(28)
  • Leetcode 剑指 Offer II 042. 最近的请求次数

    题目难度: 简单 原题链接 今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 写一个 RecentCounter 类来计算特定时间范围内最近的请求。 请实现 RecentCounter 类: RecentCounter() 初始化

    2024年02月10日
    浏览(33)
  • LeetCode:剑指 Offer 58 - II. 左旋转字符串

    🍎道阻且长,行则将至。🍓 🌻算法,不如说它是一种思考方式🍀 算法专栏: 👉🏻123 题目描述 :字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串\\\"abcdefg\\\"和数字2,该函数将返回左旋

    2024年02月02日
    浏览(33)
  • 剑指offer刷题笔记-链表

    少年何妨梦摘星 敢挽桑弓射玉衡 解决与链表相关的问题总是有大量的指针操作,而指针操作的代码总是容易出错的。很多面试官喜欢出与链表相关的问题,就是想通过指针操作来考察应聘者的编码功底。 题目链接 来自于 AcWing 、 Leetcode (LCR) 目录  从尾到头打印链表 题目

    2024年02月21日
    浏览(26)
  • 剑指 Offer 56 - II. 数组中数字出现的次数 II(位运算 / 哈希表 / 排序)

    链接:剑指 Offer 56 - II. 数组中数字出现的次数 II 难度:中等 在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。 示例 1: 输入:nums = [3,4,3,3] 输出:4 示例 2: 输入:nums = [9,1,7,9,7,9,7] 输出:1 限制: 1 = nums.length = 10000 1

    2024年02月13日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包