【基础算法】单链表的OJ练习(2) # 链表的中间结点 # 链表中倒数第k个结点 #

news2024/11/25 10:24:51

文章目录

  • 前言
  • 链表的中间结点
  • 链表中倒数第k个结点
  • 写在最后

前言

  • 对于单链表的OJ练习,需要深刻理解做题的思路,这样我们才能够在任何场景都能够熟练的解答有关链表的问题。

  • 关于OJ练习(1):-> 传送门 <-,其题目较为简单,思路也好理解,本章与(1)差不多,难度不大,核心点就在于理解解题思路。


链表的中间结点

题目链接:-> 传送门 <-

  • 该题目描述为:给你单链表的头结点 head ,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。

1.如果节点数为奇数,这个中间节点就显而易见了。(3)
在这里插入图片描述

2.如果节点数为偶数,这里认为中间两个节点的第二个节点为中间节点。(4)
在这里插入图片描述

思路一

  • 我们可以先遍历一遍链表,统计一下链表节点的个数。

  • 然后将这个个数除以二加一(count / 2 + 1)便是中间这个节点的位置。

  • 当然,我们在循环寻找这个中间节点的时候,是从头节点开始的,因此循环只需要循环((count / 2 + 1) - 1)即可。

代码实现:

struct ListNode* middleNode(struct ListNode* head){
    struct ListNode* cur = head;
    int count = 0;

    while (cur)
    {
        count ++ ;
        cur = cur->next;
    }

    count = count / 2 + 1;

    while (-- count) // 循环count - 1次
    {
        head = head->next;
    }

    return head;
}

思路二

  • 该做法为快慢指针。

  • 啥为快慢指针呢?在本题有关当中,我们定义两个指针指向链表的头节点,并且共同遍历链表,不同的是,一个指针每一次走两步,另一个指针每次走一步,这就是快慢指针。

  • 每当快指针满足循环结束条件,慢指针都是指向链表的中间节点的。因为快指针走两步,慢指针走一步,整个移动的位移差相差一倍,所以每当快指针满足结束条件的时候,慢指针走的步数都是快指针走的步数的一半, 因此慢指针指向的那个节点就是整个链表的中间节点。

  • 快指针结束的条件有两种情况,一种是快指针刚好指向空结束,一种是快指针指向尾节点结束,也就是快指针的nextNULL

1.当快指针刚好指向NULL结束,此时链表的节点个数为偶数:

在这里插入图片描述

2.当快指针指向尾节点结束,也就是快指针的nextNULL,此时链表的节点个数为奇数:

在这里插入图片描述

代码实现:

struct ListNode* middleNode(struct ListNode* head){
    struct ListNode* fast = head, * slow = head;

    while (fast && fast->next)
    {
        fast = fast->next->next;
        slow = slow->next;
    }

    return slow;
}

注意:
while循环的判断条件,fast一定要在前面,这是因为:判断是从左到右判断的,如果fast->next在前,而此时链表的结点的个数为偶数,那么fast就会直接到达NULL,这时候对空指针解引用操作就出问题了。


链表中倒数第k个结点

题目链接:-> 传送门 <-

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

在这里插入图片描述

思路一

  • 既然是倒数第k个,那我们就看看是正数的第几个。

  • 先遍历一遍单链表,统计一下链表的结点个数(count),通过数学知识,可得倒数的第k个结点就是正数的第count - k + 1个节点,这时只要在遍历一次链表,找到第count - k + 1个节点返回即可。

  • 当然,这里嘚注意k是不是大于链表节点的个数的情况。

代码实现:

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {
    struct ListNode* cur = pListHead;

    int count = 0;
    // 统计链表节点的个数
    while (cur)
    {
        count ++ ;
        cur = cur->next;
    }

    // 如果k大于链表的节点个数,直接返回NULL
    if (k > count) return NULL;
    
    int tmp = count - k;
	
	// 由于从头个节点开始算,因此只需要循环count - k次就可以找到倒数第k个节点
    while (tmp -- )
    {
        pListHead = pListHead->next;
    }

    return pListHead;
}

思路二

  • 同样是快慢指针,这里的快慢指针解法是:快指针先向后走k步或者先向后走k - 1步,然后快指针与慢指针同时向后走,当快指针满足循环结束条件停止,此时慢指针指向的节点就是倒数第k个节点。

1.如果快指针先向后走k步,此时快指针与慢指针之间相差k步,因此,当快指针到达NULL时,此时慢指针刚好指向倒数第k个节点。(倒数第k个节点与NULL相差k步)(循环结束条件:fast == NULL)

在这里插入图片描述

2.如果快指针先向后走k - 1步,此时快指针与慢指针之间相差k - 1步,然后快指针与慢指针同时向后走,当快指针满足循环结束条件停止,此时慢指针指向的节点就是倒数第k个节点。(倒数第k个节点与尾节点相差k - 1步)(循环结束条件:fast->next == NULL

在这里插入图片描述

代码实现:(这里只实现fast先走k步的情况,fast先走k - 1的情况大同小异)

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {
    struct ListNode* slow = pListHead, * fast = pListHead;
    // fast先走k步
    while (k -- )
    {
        if (!fast) return NULL; // 如果k还没为0但fast已经指向空了,说明k大于链表的结点的个数,此时直接返回NULL
        fast = fast->next;
    }
	
	// 当fast为NULL时结束循环
    while (fast)
    {
        fast = fast->next;
        slow = slow->next;
    }

    return slow;
}

写在最后

对于单链表的题目练习,最重要的是思路,我们在数据结构阶段要养成画图的习惯,因为它能帮助我们更好的理解。后续还会有单链表相关的题目练习。

感谢阅读本小白的博客,错误的地方请严厉指出噢!

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

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

相关文章

支持向量机简单介绍

1.概述 支持向量机&#xff08;SVM&#xff0c;支持向量网络&#xff09;&#xff0c;是机器学习中获得关注最多的算法没有之一。它源于统计学习理论。 | | | 功能有监督学习线性二分类与多分类&#xff08;Linear Support Vector Classification&#xff09;非线性二分类与多…

你真的会用三元运算符吗?

在我们日常搬砖中&#xff0c;我们经常会看到三元运算符&#xff0c;但是你了解三元运算符到底是怎么用吗&#xff1f;接下来我们就下来详细介绍一下三元运算符大厂面试题分享 面试题库前后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★地址&#x…

职场人必备的6款实用办公app,每一款都是心头爱

打工人不容易啊&#xff0c;不提高工作效率怕是要被淘汰了。今天给大家分享6款职场人必备的实用办公APP&#xff0c;免费效率神器让工作事半功倍。这些APP每一款都是我的心头爱&#xff0c;肯定会让人大开眼界的&#xff0c;超级实用&#xff0c;直接往下看吧。1、向日葵远程控…

docker前端开发环境搭建

docker 做本地开发环境的好处&#xff1a; 隔离环境 各项目所需node等版本不一&#xff0c;切换起来比较麻烦&#xff0c;虽用 nvm可 来解决&#xff0c;但使用 docker 更优 快速配置环境 新电脑&#xff0c;新系统&#xff0c;新环境&#xff0c;第一件事就是配置开发环境。下…

[Java代码审计]—MCMS

环境搭建 MCMS 5.2.4&#xff1a;https://gitee.com/mingSoft/MCMS/tree/5.2.4/利用 idea 打开项目 创建数据库 mcms&#xff0c;导入 doc/mcms-5.2.8.sql 修改 src/main/resources/application-dev.yml 中关于数据库设置参数 启动项目登录后台 http://localhost:8080/ms/l…

【NLP】自动化计算文本文件TTR的bash脚本

自动化计算文本文件TTR的bash脚本 简介 这是一个可以计算文本文件TTR的bash脚本&#xff0c;文件名为&#xff1a;calculate_TTR.sh。它会接收一个文件名作为参数&#xff0c;并输出总单词数、特异单词数和TTR。 TTR是什么 TTR&#xff08;Type-Token Ratio&#xff09;是用…

javaweb期末复习重点

2022.12.12javaweb复习重点 10个选择题10个填空题10个判断2-3简答题2个程序题&#xff08;15分一个&#xff09; 1.HTML、Javascript、divcss ? 详细解释 HTML HTML(Hyper Text Mark-up Language)即超文本标记语言&#xff0c;是用于描述网页的一种标记语言。简单来说&…

九龙证券|全面推进技术研发,6G概念爆火!多家上市公司表示已布局

据商场研讨组织估计&#xff0c;2040年全球6G商场规划逾越3400亿美元。 6G概念指数逆市大涨5.61% 3月2日&#xff0c;6G概念指数逆市上涨5.61%。成份股中&#xff0c;本川智能、沃特股份、邦本科技、我国卫通涨停&#xff1b;信科移动-U大涨14.61%&#xff0c;亚光科技、信维通…

html常用标签2和语法练习

目录 1.表单标签 form标签 input标签 选择框 复选框:checkbox 按钮框:button 文件选择框 多行编辑框:textarea 2.html语法练习 展示简历信息 填写简历信息 ​编辑 3.HTML特殊字符 1.表单标签 表单是让用户输入信息的重要途径 表单域:包含表单元素的区域,重点是form…

手把手教你用js实现手机通讯录功能(附源码)

js实现手机通讯录效果图需求需求一&#xff1a;锚点通过#id配合a标签使用css中scroll-behavior属性的使用需求二需求三获取汉字拼音的首字母方法1&#xff1a;使用插件&#xff0c;这里推荐pinyin-pro方法2&#xff1a;使用unicode去重数组中冗余的对象法一&#xff1a;用Map去…

abap MODIFY常用语法解析

MODIFY 是既可以操作数据又可以操作内表的一个语法, 实现的逻辑都一样. 如果你内表或数据库中存在该行数据会对该行数据进行更新. 如果不存在,就会插入数据. , 1.如果it_tab是带有标题行的内表,是可以忽略FROM wa_tab工作区的 MODIFY it_tab .2.把工作区wa_tab中的数据更新…

中高级前端面试宝典之浏览器篇

中高级前端面试宝典 作为一名前端开发工程师&#xff0c;要掌握的知识点是多而杂的&#xff0c;在面试刷题阶段&#xff0c;经常没头没脑的&#xff0c;我将面试题系统化&#xff0c;分了好几个系列&#xff0c;祝愿大家&#xff08;包括我&#xff09;在这个疫情刚过去的互联网…

高通平台开发系列讲解(摄像头篇)QCM6490 上摄像头驱动开发

文章目录 一、Camera 硬件简介二、内核驱动移植2.1、确定设备树2.2、增加 camera 节点2.3、配置相关 GPIO沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍 qcm6490 摄像头驱动开发。 一、Camera 硬件简介 摄像头连接器一般会包含 Mipi 信号、mclk、供电、re…

从业者必读,一篇文章轻松掌握DevOps核心概念和最佳技能实践!

文章目录前言一. DevOps的定义及由来二. DevOps的价值三. devops工具有哪些3.1 devops工程师的硬实力3.2 devops工程师的软实力总结前言 大家好&#xff0c;又见面了&#xff0c;我是沐风晓月&#xff0c;本文是对DevOps的总结&#xff0c;一篇文章告诉你什么是DevOps. 对很多…

Windows+CLion+Opencv+NCNN笔记

一、下载protobuf和ncnn在腾讯优图的github上下载ncnn&#xff0c;下载链接为https://github.com/Tencent/ncnn。在安装NCNN之前需要编译安装protobuf&#xff0c;protobuf3.4.0下载链接为https://github.com/google/protobuf/archive/v3.4.0.zip。下载后解压&#xff0c;将ncn…

什么是决策能力?HR人才测评

什么是决策能力&#xff1f;决策能力是一项多种能力的综合&#xff0c;指的是能够认识、理解、并且综合分析后得出判断&#xff0c;从而采取行动的能力。如&#xff1a;对当前形势的分析&#xff0c;对相关人员的判断&#xff0c;能做出合理的&#xff0c;适当的行动来应对。决…

【MyBatis】篇一.

文章目录1、MyBatis概述2、环境搭建1、MyBatis概述 认识&#xff1a; JavaEE开发的一个套件SSM&#xff0c;即&#xff1a; MyBatis是一个持久层的框架&#xff0c;是对JDBC的一个封装&#xff0c;是一个半自动的ORM框架。 ORM即实体类对象和数据库中的数据的一个映射关系&am…

关于Facebook Messenger CRM,这里有你想要知道的一切

关于Facebook Messenger CRM&#xff0c;这里有你想要知道的一切&#xff01;想把Facebook Messenger与你的CRM整合起来吗&#xff1f;这篇博文是为你准备的! 我们将介绍有关获得Facebook Messenger CRM整合的一切信息。然后&#xff0c;我们将解释为什么你需要像SaleSmartly&a…

Git使用:常用命令汇总

前言 Git对于程序猿来说并不陌生&#xff0c;它是一款非常好用的项目管理工具&#xff0c;无论是前端开发还是后台开发&#xff0c;只要项目里面可以使用Git来管理&#xff0c;就会涉及代码的提交和合并操作&#xff0c;主要是常用的Git操作命令的使用&#xff0c;虽然目前有好…

CA-SSL:用于检测和分割未知类的半监督学习

论文作者 | Lu Qi, Jason Kuen , Zhe Lin, and etal论文来源 | CVPR2022文章解读 | William1、摘要为了提高检测/分割的性能&#xff0c;现有的自监督和半监督方法从未标记的数据中提取任务相关或任务特定的训练标签&#xff0c;但这两种方法对于任务性能都是次优的&#xff0c…