【剑指offer|图解|链表】链表的中间结点 + 链表中倒数第k个结点

news2024/11/17 23:57:20

在这里插入图片描述
🌈个人主页:聆风吟
🔥系列专栏:数据结构、算法模板
🔖少年有梦不应止于心动,更要付诸行动。


文章目录

  • 📋前言
  • 一. ⛳️链表的中间结点
  • 二. ⛳️链表中倒数第k个结点
  • 📝结语

📋前言

    💬 hello! 小伙伴们大家好哇,今天作者给大家带来的是链表的相关面试题的讲解,在学习了下文之后,相信大家可以更好的理解链表,并且我们同过本文的练习相信大家对快慢双指针也将会有一定的了解。
    📚 系列专栏:本期文章收录在《剑指offer每日一练》,大家有兴趣可以浏览和关注,后面将会有更多精彩内容!
    🎉 欢迎大家关注🔍点赞👍收藏⭐️留言📝!



一. ⛳️链表的中间结点

⌈ 在线OJ链接,可以转至此处自行练习 ⌋

题目:
给你单链表的头结点 head ,请你找出并返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

示例:

输入: head = [1,2,3,4,5]
输出: [3,4,5]
解释: 链表只有一个中间结点,值为 3

限制:

  • 链表的结点数范围是 [1, 100]
  • 1 <= Node.val <= 100

解题思路:
暴力求解(不推荐)
拿到本题我们很容易想到一种方法就是:遍历整个链表,记录整个链表的元素个数count,然后求出中间结点的位数cout/2 + 1,最后从头开始遍历链表到cout/2 + 1位置的结点,返回该结点即可。显然该方法是比较慢的,那么有没有更好的方法呢?当然是有的,我们可以借助快慢双指针进行快速求解。

快慢双指针(推荐)
创建快慢双指针 slowfast 分别指向链表的头部,循环执行:

  • 快指针 fast 每轮走两步
  • 慢指针 slow 每轮走一步

这样 fast 的步数恒为 slow 的 2 倍,因此当快指针遍历完链表时,慢指针就指向链表中间节点。而由于长度为偶数的链表有两个中间节点,因此需要分两种情况考虑:

  • 链表的长度为奇数:当 fast 走到链表的尾结点时,slow 正好是中间结点;
  • 链表的长度为偶数:当 fast 为空(越过尾结点)时,slow 正好走到第二个中间结点。

在这里插入图片描述
总结以上规律,应在当 fast 遇到或越过尾节点时跳出循环,并返回 slow 即可。

示例动图展示:在这里插入图片描述

c代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* middleNode(struct ListNode* head) {
    //创建快慢指针
    struct ListNode* slow = head, *fast = head;

    //循环执行
    while(fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;
    }

    //返回中间结点
    return slow;
}


二. ⛳️链表中倒数第k个结点

⌈ 在线OJ链接,可以转至此处自行练习 ⌋

题目:
输入一个链表,输出该链表中倒数第k个结点。

示例:

输入: 1,{1,2,3,4,5}
输出: {5}

解题思路:
快慢双指针
学习了上题相信大家对快慢双指针已经有了一定了解。本题我们可以先创建快慢双指针 slowfast 分别指向链表的头部:

  1. 先让快指针fast 先向后走k 步;
    注意:当fast向后走的过程中,fast提前为空,说明链表的长度没有 k 大,需要终止程序,返回结果NULL。
  2. 然后快指针fast 和慢指针slow 一起循环向后走;
  3. 直到fast为空时终止循环,返回slow即可。

示例动图展示:在这里插入图片描述

c代码:

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */

/**
 * 
 * @param pListHead ListNode类 
 * @param k int整型 
 * @return ListNode类
 */
struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {
    // write code here

    //创建快慢双指针 slow 和 fast 分别指向链表的头部
    struct ListNode* slow = pListHead, *fast = pListHead;

    //先让快指针fast 先向后走 k 步
    for(int i = 0; i < k; i++)
    {
        //如果fast提前为空,需要终止程序,返回结果NULL
        if(fast == NULL)
        {
            return NULL;
        }

        fast = fast->next;
    }

    //快指针fast 和慢指针slow 一起循环向后走
    //fast为空时终止循环
    while(fast)
    {
        slow = slow->next;
        fast = fast->next;
    }

    //返回
    return slow;
}


📝结语

     今天的干货分享到这里就结束啦!如果觉得文章还可以的话,希望能给个三连支持一下,聆风吟的主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是作者前进的最大动力!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1235135.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VPX 插座(VITA46)介绍及应用 (简单介绍)

1. VPX 插座的介绍 VPX是VITA(VME International Trade Association, VME国际贸易协会)组织于2007年在其VME总线基础上提出的新一代高速串行总线标准。VPX总线的基本规范、机械结构和总线信号等具体内容均在ANSI/VITA46系列技术规范中定义。VPX就是基于高速串行总线的新一代总线…

【Node.js】大前端技能最通俗易懂的讲解 快速入门必看

目录 1、概述前端工具VSCode安装 2、NodeJS的安装 3、NodeJS了解和快速入门 4、NodeJS实现HttpServer服务 5、NodeJS实现操作MySQL数据库 Node.js是一个基于Chrome V8引擎的JavaScript运行环境&#xff0c;它允许开发者在服务器端执行Node.js是一个基于Chrome V8引擎的Ja…

跳台阶游戏(Python排列组合函数itertools.combinations的应用)

给定台阶总数和两种单次可跳级数&#xff0c;编写自定义函数&#xff0c;计算所有的游戏组合方案数量。 (笔记模板由python脚本于2023年11月19日 19:18:48创建&#xff0c;本篇笔记适合熟悉python自定义函数编写&#xff0c;了解排列组合知识的coder翻阅) 【学习的细节是欢悦的…

(一)pytest自动化测试框架之生成测试报告(mac系统)

前言 我们可以通过pytest-html插件来生成测试报告&#xff0c;但是pytest-html插件生成的测试报告不够美观&#xff0c;逼格也不够高&#xff0c;通过allure生成的测试报告是比较美观的&#xff0c;花里胡哨的&#xff0c;能够提升一个level。 allure官网&#xff1a; Allure…

基于纹理特征的kmeas聚类的图像分割方案

Gabor滤波器简介 在图像处理中&#xff0c;以Dennis Gabor命名的Gabor滤波器是一种用于纹理分析的线性滤波器&#xff0c;本质上是指在分析点或分析区域周围的局部区域内&#xff0c;分析图像中是否存在特定方向的特定频率内容。Gabor滤波器的频率和方向表示被许多当代视觉科学…

美国国家安全实验室员工详细数据在网上泄露

一个从事出于政治动机的攻击的网络犯罪组织破坏了爱达荷国家实验室&#xff08;INL&#xff09;的人力资源应用程序&#xff0c;该组织周日在电报上发帖称&#xff0c;已获得该核研究实验室员工的详细信息。 黑客组织 SiegedSec 表示&#xff0c;它已经访问了“数十万用户、员…

【LeetCode刷题-数组】--18.四数之和

18.四数之和 方法&#xff1a;排序双指针 先对数组进行排序&#xff0c;使用两重循环分别枚举前两个数&#xff0c;然后在两重循环枚举到的数之后使用双指针枚举剩下的两个数 class Solution {public List<List<Integer>> fourSum(int[] nums, int target) {List…

8051指令系统

目录 数据传送指令 算术运算指令 位操作类指令 某些指令的说明 截图来自&#xff1a; 第三章.8051指令系统&#xff08;1&#xff09;_哔哩哔哩_bilibili 数据传送指令 算术运算指令 位操作类指令 某些指令的说明

ChatGPT暂时停止开通plus,可能迎来封号高峰期

前言: 前两日,chat gpt的创始人 San Altman在网上发表了,由于注册的使用量超过了他们的承受能力,为了确保每个人的良好使用体验,chat gpt将暂时停止开通gpt plus。 情况: 前段时间好像出现了官网崩溃的情况,就连api key都受到了影响,所以现在就开始了暂时停止plus的注…

09【保姆级】-GO语言的数组和切片

09【保姆级】-GO语言的数组 一、数组1.1 数组定义1.2 数组的使用1.3 数组的遍历1.4 数组的应用案例 二、切片2.1 切片的介绍2.2 切片的原理2.3 切片的三种使用 之前我学过C、Java、Python语言时总结的经验&#xff1a; 先建立整体框架&#xff0c;然后再去抠细节。先Know how&a…

基于白冠鸡算法优化概率神经网络PNN的分类预测 - 附代码

基于白冠鸡算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于白冠鸡算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于白冠鸡优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络…

白银投资的升值空间及未来趋势

在投资多样化的今天&#xff0c;人们可选择的投资产品也越来越多。白银作为具有较高价值的贵金属&#xff0c;一直以来便是仅次于黄金的贵金属投资品种&#xff0c;今年来也受到更多投资者的关注。那么白银的升值空间及未来趋势如何&#xff1f;是否值得投资&#xff1f;这边将…

原来 TinyVue 组件库跨框架(Vue2、Vue3、React、Solid)是这样实现的?

本文由 TinyVue 组件库核心成员郑志超分享&#xff0c;首先分享了实现跨框架组件库的必要性&#xff0c;同时通过演示Demo和实际操作向我们介绍了如何实现一个跨框架的组件库。 前言 前端组件库跨框架是什么&#xff1f; 前端组件库跨框架是指在不同的前端框架&#xff08;如…

Keka v1.3.5(mac压缩解压工具)

Keka是一款功能强大的文件压缩和解压缩软件&#xff0c;为Mac系统用户提供便捷、高效的文件管理工具。以下是Keka的主要特点和功能&#xff1a; 多种压缩格式支持&#xff1a;Keka支持多种常见的压缩格式&#xff0c;包括ZIP、7Z、RAR、TAR、GZIP等。它能够方便地创建和提取这些…

从Hugging Face上手动下载并加载预训练模型

0. 说明&#xff1a; 从 Hugging Face 上下手动载预训练的蛋白质语言模型&#xff08;以ProstT5为例&#xff09;&#xff0c;用模型中的 encoder 部分对蛋白质进行编码&#xff0c;得到 embedding features&#xff0c;用于下游的任务。 【ps. 除了手动下载之外&#xff0c;…

趣学python编程(七、实现个小网站如此简单 web.py使用介绍)

这里先拿一个小网站的例子来举例&#xff0c;保持好奇心就可以了。因为兴趣才是最好的老师&#xff0c;它能激发人内在的行动力。这里介绍个使用web.py轻量级框架实现的一个小网站&#xff0c;可以看到实现个小网站并不难。python都能用来干什么&#xff1f;那么网站就是它众多…

2023感恩节倒计时:跨境卖家如何借势风潮,成功脱颖而出?

感恩节&#xff0c;是西方世界最为重要的家庭聚会时刻之一&#xff0c;也是全球购物狂欢的开端。对于跨境电商卖家而言&#xff0c;这一时刻既是挑战&#xff0c;更是机遇。在感恩节大促倒计时的紧张氛围中&#xff0c;如何让自己的产品在激烈的市场竞争中脱颖而出&#xff0c;…

转型做视频了,博客就是稿子,继续坚持写博客,同时发布视频,能写博客说明思路清晰了,能再讲明白,理解就更透彻了,紧跟上时代发展。

1&#xff0c;今天特别记录下&#xff0c;B站给开通了《合集》功能 最近使用视频制作了几个视频。播放量还不错&#xff0c;最好的已经到了 2.6K了。 然后粉丝也涨到了 200个。 添加链接描述 紧跟时代&#xff1a;从写博客到录视频&#xff0c;粉丝大涨&#xff0c;突破200个&…

Mybatis Plus分页实现逻辑整理(结合芋道整合进行解析)

Mybatis Plus分页实现逻辑整理&#xff08;结合芋道整合进行解析&#xff09; 我希望如春天般的你&#xff0c;身着白色的婚纱&#xff0c;向我奔赴而来&#xff0c;我愿意用全世界最温情的目光&#xff0c;朝着你的方向望去——姗姗来迟。 1.背景介绍 https://baomidou.com/p…

多目标应用:基于多目标粒子群优化算法MOPSO求解微电网多目标优化调度(MATLAB代码)

一、微网系统运行优化模型 微电网优化模型介绍&#xff1a; 微电网多目标优化调度模型简介_IT猿手的博客-CSDN博客 二、多目标粒子群优化算法MOPSO 多目标粒子群优化算法MOPSO简介&#xff1a; 三、多目标粒子群优化算法MOPSO求解微电网多目标优化调度 &#xff08;1&…