【leetcode】链表的中间节点|链表中倒数第k个节点

news2025/1/12 20:47:36

目录

1.链表的中间节点

2.链表中倒数第k个节点 


1.链表的中间节点

思路1:遍历链表,统计节点个数count,返回第count/2 +1个节点 

📖Note:注意循环条件为--mid,--mid循环执行mid-1次,mid--循环mid次,返回的是中间节点的下一个节点

struct ListNode* middleNode(struct ListNode* head){
    struct ListNode* cur = head;
    int count = 0;
    //统计节点个数
    while(cur)
    {
        count++;
        cur = cur->next;
    }
    //返回第count/2+1个节点
    cur = head;
    int mid = count/2 + 1;
    while(--mid)
    {
        cur = cur->next;
    }

    return cur;

}

思路二:快慢指针

设置一个慢指针slow,一个快指针fast,慢指针一次走一步,快指针一次走两步

需要分两种情况:链表节点个数为奇数个和节点个数为偶数个

1️⃣奇数个的情况

当链表节点个数为奇数个时,可以发现,快指针fast->next == NULL时,遍历结束,此时慢指针slow刚好指向中间节点

2️⃣偶数个的情况:

当链表节点个数为偶数个时,可以发现,快指针fast == NULL时,遍历结束,此时慢指针slow刚好指向中间节点

 综上:遍历结束的条件为fast == NULL或fast->next == NULL

参考代码如下:

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

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

    return slow;

}

2.链表中倒数第k个节点 

与上题思路二相似的还有下例 

分析:

输出链表中倒数第k个节点,假设有一个指针指向链表尾节点的next,即指向NULL,我们从这个节点向前看,尾节点相对这个指针来说是第一个节点,相对链表头指针head来说便是倒数第一个节点,对于倒数第k个节点,指向这个节点的指针和指向NULL的指针始终相差的是k个节点;设置一个快指针fast,一个慢指针slow,fast指针先走k步,slow指针不动,此时fast指针和slow指针就相差k个节点,然后slow指针和fast指针同时向后走,直到fast指针指向NULL,此时slow指向的节点就是倒数第k个节点

以输出倒数第三个节点为例,步骤如下图:

🌸特殊情况讨论:

1️⃣空链表:返回空指针

2️⃣倒数第一个

由上图可以发现,输出倒数第一个节点的逻辑与输出倒数的k个节点的逻辑相同 

3️⃣倒数第N个(链表长度为N)

由上图可以发现,输出倒数第N个节点的逻辑与输出倒数的k个节点的逻辑相同 

4️⃣k=0或k>N(N为链表的长度)

  • k=0时,输出链表的倒数第0个节点,应该为空

此时fast指针和slow指针都不会发生变化,,所以

  • k>N时,fast先走k步会发生空指针的访问

在fast指针向后走k步的过程中,需要随时检查fast指针的有效性,如果fast==NULL,直接返回空指针即可

参考代码如下:

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {
    // write code here
    struct ListNode* slow = pListHead,*fast = pListHead;
    if(pListHead)
    {
        while(k--)
        {
            if(fast == NULL)
            {
                return fast;
            }
            fast = fast->next;
        }
        while(fast)
        {
            slow = slow->next;
            fast = fast->next;
        }
    }

    return slow;

}

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

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

相关文章

SpringBoot 8种异步实现方式

前言:异步执行对于开发者来说并不陌生,在实际的开发过程中,很多场景多会使用到异步,相比同步执行,异步可以大大缩短请求链路耗时时间,比如:「发送短信、邮件、异步更新等」,这些都是…

采用串级控制和超高精度PID调节器的微张力精密控制技术

摘要:采用当前的各种涂布机很难适用气体扩散层这类脆性材料的涂布工艺,需要控制精度更高的微张力控制系统。为此本文基于串级控制原理,提出了采用双闭环PID控制模式和超高精度PID张力控制器的解决方案,一方面形成浮动摆棍闭环和主…

python机器学习(五)逻辑回归、决策边界、代价函数、梯度下降法实现线性和非线性逻辑回归

线性回归所解决的问题是把数据集的特征传入到模型中,预测一个值使得误差最小,预测值无限接近于真实值。比如把房子的其他特征传入到模型中,预测出房价, 房价是一系列连续的数值,线性回归解决的是有监督的学习。有很多场…

kafka权威指南学习以及kafka生产配置

0、kafka常用命令 Kafka是一个分布式流处理平台,它具有高度可扩展性和容错性。以下是Kafka最新版本中常用的一些命令: 创建一个主题(topic): bin/kafka-topics.sh --create --topic my-topic --partitions 3 --replic…

【论文阅读22】Label prompt for multi-label text classification

论文相关 论文标题:Label prompt for multi-label text classification(基于提示学习的多标签文本分类) 发表时间:2023 领域:多标签文本分类 发表期刊:Applied Intelligence(SCI二区&#xff0…

生态系统景观指数-聚集度指数AI计算

景观指数是景观生态学的常见指标,可用于不同生态系统的特征识别。景观指数是反映景观结构与空间格局的定量指标,目前已成为景观生态学领域常用的分析景观格局、度量空间异质性的重要方法。不同水平下的指数结果往往代表不同含义,应在把握指数…

git冲突“accept theirs”和“accept yours”

Accept Yours 就是直接选取本地的代码,覆盖掉远程仓库的 Accept Theirs 是直接选取远程仓库的,覆盖掉自己本地的 我们选择Merge,自己手动行进选择、修改。 这里左边部分是你本地仓库的代码,右边部分是远程仓库的代码,中间的res…

uniapp WIFI上下班打卡

大纲 🥙 uniapp官网:uni-app官网 🥙 WIFI功能模块: 1、下载 wifi 插件 uni-WiFi 2、在 manifest.json 中 App权限配置中 配置权限 1. ACCESS_WIFI_STATE (访问权限状态) 2. CHANGE_WIFI_STATE&#xff…

13.Netty源码之Netty中的类与API

highlight: arduino-light ServerBootstrap Bootstrap 意思是引导,一个 Netty 应用通常由一个 Bootstrap 开始,主要作用是配置整个 Netty 程序,串联各个组件,Netty 中ServerBootstrap 是服务端启动引导类。 java //泛型 AbstractB…

VMware上安装Ubuntu64

D:\VMware\Virtual Machines\Ubuntu64 D:\VMware\Virtual Machines\Ubuntu64\Ubuntu64.vmdk 继续

【ESP32】调试UART功能

1.创建示例项目uart_echo:VSCODE中->“查看”->”命令面板“->输入:Show Examples projects->选择Use current ESP-IDF(C:\Espressif\frameworks\esp-idf-v5.1)->弹出示例ESP-IDF Examples,选择peripherals->uart->uart…

泰晓科技发布 Linux Lab v1.2 正式版

导读近日消息,Linux Lab 是一套用于 Linux 内核学习、开发和测试的即时实验室,官方称其“可以极速搭建和使用,功能强大,用法简单”。 自去年 12 月份发布 Linux Lab v1.1 后,v1.2 正式版目前已经发布于 GitHub 及 Gite…

Tensorflow(二)

一、过拟合 过拟合现象:机器对于数据的学习过于自负(想要将误差减到最小)。 解决方法:利用正规化方法 二、卷积神经网络(CNN) 卷积神经网络是近些年来逐渐兴起的人工神经网络,主要用于图像分类、计算机视觉等。 卷积:例如对图片每一小块像素区域的处理&#xff…

微服务体系<1>

我们的微服务架构 我们的微服务架构和单体架构的区别 什么是微服务架构 微服务就是吧我们传统的单体服务分成 订单模块 库存模块 账户模块单体模块 是本地调用 从订单模块 调用到库存模块 再到账户模块 这三个模块都是调用的同一个数据库 这就是我们的单体架构微服务 就是…

RTaW-Pegase实时通信网络架构的建模,仿真和自动配置

RTaW-Pegase 用于构建和优化使用在汽车领域、航空航天领域以及工业领域的通信网络:时间敏感网络(TSN)、CAN (FD,XL)、LIN、Arinc、 NoC车载网络, 以及车外通信的无线网络。除了精确定时的仿真外…

F5 LTM 知识点和实验 2-负载均衡基础概念

第二章:负载均衡基础概念 目标: 使用网页和TMSH配置virtual servers,pools,monitors,profiles和persistence等。查看统计信息 基础概念: Node一个IP地址。是创建pool池的基础。可以手工创建也可以自动创…

7.26总结

继承和实现的区别: 1.修饰符不同: 继承修饰符extends,实现修饰符implements 2.单继承,多实现,Java允许一个类仅能继承一个其他类,即一个类只能有一个父类,这个限制被称为单继承性,而接口允许…

测试开源C#人脸识别模块ViewFaceCore(4:口罩检测、性别预测、年龄预测)

ViewFaceCore模块中的MaskDetector类支持识别人脸是否戴了口罩或有遮挡&#xff0c;主要调用PlotMask函数执行口罩检测操作&#xff0c;其函数原型如下所示&#xff1a; PlotMaskResult PlotMask<T>(T image, FaceInfo info)public class PlotMaskResult{//// 摘要:// …

Docker容器命令(有点详细)

文章目录 Docker 容器容器运行背后启停命令run交互模式需不需要接/bin/bash createexecattachpstoplogscprmcommitexportimportsystem对比export、saveimport、loadcommit、exportimport Docker 容器 Docker 容器是 Docker 平台中的一个基本概念&#xff0c;它是 Docker 技术的…

SpringCloud学习路线(12)——分布式搜索ElasticSeach数据聚合、自动补全、数据同步

一、数据聚合 聚合&#xff08;aggregations&#xff09;&#xff1a; 实现对文档数据的统计、分析、运算。 &#xff08;一&#xff09;聚合的常见种类 桶&#xff08;Bucket&#xff09;聚合&#xff1a; 用来做文档分组。 TermAggregation&#xff1a; 按照文档字段值分组…