数据结构——链表——找中间结点、倒数第K个结点、删除倒数第K个结点(C语言版)(要求只能遍历一次链表)

【数据结构】链表OJ第二篇 —— 链表的中间节点 && 链表中倒数第k个节点 && 链表分割 && 链表的回文结构 && 相交链表 链表的中间节点、链表中倒数第k个节点、链表分割、链表的回文结构、相交链表 阅读详情

由于要进行期末考试了,所以就将明天的提前发了,留一点复习的时间!!

这次的题是在只进行一次遍历链表的情况下,找到中间结点;或者找到倒数第K个结点,当明白了这两个问题的思想之后,最后的删除倒数第K个结点就只是调用一下之前的函数了!

这儿有个趣味小问题:一百米赛跑,兔子的速度是乌龟的两倍,那么兔子到终点后,乌龟的位置在哪儿??问题很显然,乌龟就在五十米处,也就是整个赛道的中间点。

由此可见:遍历一次链表,设置一个跑得快的快指针,和一个跑的慢的慢指针,快指针的速度是慢指针的两倍,那么问题就解决了!

具体怎么实现呢?如图:
1、空链表直接返回
2、一个结点的链表也直接返回头结点
3、多个结点,则采用快慢指针的方法,最后达到找到middle结点的效果

这里写图片描述

代码如下:

PNode FindMiddleNode(PNode pHead)
{
    assert(pHead);                           //参数检测

PNode pFast;                             //设置 快慢指针
PNode pSlow;

if (NULL == pHead)
{
    printf("链表为空,无中间结点!!\n");
    return NULL;
}

if (NULL == pHead->_pNext)                                    //只有一个结点 直接返回头结点
    return pHead;

pFast = pHead;
pSlow = pHead;

while (pFast->_pNext->_pNext)               // 遍历链表  快指针一次走两步,慢指针一次走一步
{
    pFast = pFast->_pNext->_pNext;        
    pSlow = pSlow->_pNext;
    if (NULL == pFast->_pNext)
        return pSlow;
}

return pSlow;                                      //返回慢指针
}

类似的方法:将快指针走两倍慢指针的方式稍作改变:快指针先走K步,然后快慢指针以相同的速度一起走,当快指针走到NULL的时候,慢指针正好走到倒数第K个结点。

如图:K先走两步,在同时走,达到找倒数第K个结点的目的!!
这里写图片描述

代码如下:

PNode FindLastKNode(PNode pHead, int K)
{
    assert(pHead);                                   //参数检测

PNode pFast = pHead;
PNode pSlow = pHead;

if (NULL == pHead)                               //空链表 
{
    printf("链表为空,找不到该结点!!\n");
    return NULL;
}

while (pFast)
{
    while (K)                                  //快指针 先走 K 步
    {
        if (NULL == pFast)                               //链表的结点数 小于 K    找不到倒数第 K 个结点
        {
            printf("倒数第 %d 结点不存在!\n", K);
            return NULL;
        }
        pFast = pFast->_pNext;
        --K;
    }
    pFast = pFast->_pNext;                           //快指针先走 K 步 之后   快慢指针 以相同速度一起走
    pSlow = pSlow->_pNext;
}

return pSlow;
}

很简单,找到了上面两个题的思路之后,对于删除倒数第K个结点,我们只需要调用以上函数即可:

代码如下:

void DeleteLastKNode(PNode pHead, int K)
{
    assert(pHead);                                         //参数检测

PNode pDelet = FindLastKNode(pHead, K);                //找到倒数 K 结点 用到了一次遍历链表

if (NULL == pDelet->_pNext)                            //此结点为尾结点,直接删除并且赋空
{
    free(pDelet);
    pDelet = NULL;
}
else                                                    //此结点为非尾结点,调用函数删除   无遍历链表操作
{
    DeleteListNotTailNode(pDelet);
}

}

其中调用了删除非尾结点函数,对于这个函数,我的上一篇优快云有详细的解题过程和思路:
链接如下:https://blog.youkuaiyun.com/code_zx/article/details/80580316
最后:献上测试函数以及测试结果
测试函数:

void testListFindAndDelet()
{
    PNode pHead;
    PNode pos;

SListInit(&pHead);

PNodePushBack(&pHead, 1);
PNodePushBack(&pHead, 2);
PNodePushBack(&pHead, 3);
PNodePushBack(&pHead, 4);
PNodePushBack(&pHead, 5);
printSList(pHead);

pos = FindMiddleNode(pHead);
DeleteListNotTailNode(pos);
printSList(pHead);

pos = FindLastKNode(pHead, 2);
DeleteListNotTailNode(pos);
printSList(pHead);

DeleteLastKNode(pHead, 2);
printSList(pHead);

}

测试结果:首先尾插1,2,3,4,5;然后找到中间结点并且删除得到:1,2,4,5;再找到倒数第二个结点删除得到:1,2,5;最后删除倒数第二个结点得到:1,5;
这里写图片描述
欢迎访问,谢谢支持!!

达芬奇Pro开发板硬件验证全流程指南 FPGA开发板硬件验证是嵌入式系统可靠性的基石,其核心在于理解SoC启动时序、IO资源映射与高速接口物理层约束。基于Xilinx Zynq-7000异构架构的开发平台,需围绕电源完整性、时钟稳定性、信号完整性及软硬协同启动链路展开分层测试。技术价值体现在规避量产失效率、支撑高可靠工业控制与实时图像处理等场景。典型应用涵盖千兆以太网通信验证、DVP摄像头与RGB LCD显示链路调试、以及SFP+光纤接口PRBS误码率测试。本文聚焦达芬奇Pro系列开发板,深入解析JTAG下载、QSPI Flash重烧录、RGM 阅读详情

相关推荐

学习笔记之——Event Camera(事件相机)调研

概述 Event Camera是一种bio-inspired sensor,对应的领域为bio-inspired vision。对于传统的相机,从某种程度上,是捕获一个静态/静止的空间,而Event Camera的目的是:敏感地捕捉运动的物体。 对于传统RGB-camera,相机传回的信息是同步的,所谓同步,就是在某一时刻t,相机会进行曝光,把这一时刻所有的像素填在一个矩阵里回传,一张照片就诞生了。一张照片上所有的像素都对应着同一时刻。至于视频,不过是很多帧的图片,相邻图片间的时间间隔...

gwpscut的博客 3万+

删除链表的倒数第k个节点(C++)详细

删除链表的倒数第k个节点 思想及算法 因为要删除倒数第k个节点,因此要知道是的正序的第几个,所以可以先遍历一遍链表获得链表的长度。 代码 #include<iostream> using namespace std; struct list { int val; list* next; list(int x) :val(x), next(nullptr) {} }; list* insert(list* head, int x) { list* p = head; while (

VegetableGirl的博客 667

车辆TBOX科普 第7次 TBOX技术深度解析:硬件架构与核心组件详解

摘要: TBOX(车载远程信息处理单元)是智能网联汽车的核心组件,承担数据采集、通信连接与安全交互等关键功能。其硬件架构以主控单元为核心,采用ARM架构处理器(如NXP i.MX系列)实现高效能低功耗处理,搭配DDR4/LPDDR5内存保障性能,eMMC/UFS存储确保数据可靠性。设计中需平衡车规级可靠性(AEC-Q100)、EMC兼容性及成本控制,同时集成通信、定位与安全模块。未来趋势聚焦异构计算、先进制程及功能安全(ASIL-D)与信息安全融合,推动TBOX向边缘计算节点演进。该技术是汽车智能化转型的重

IT深耕十余载,大道之简 861

链表的中间结点(双(快、慢)指针)-C语言

链表的中间结点(双(快、慢)指针) #include <stdio.h> typedef struct ListNode { int data; struct ListNode *next; }Node; void CreateList(Node **head, int *arr, int n); Node *middleNode(Node *head); void printNode(Node *mmp); int main() { Node *head = NULL; int a

qq_41301428的博客 490

S32DS使用手把手教程:从零实现CAN通信配置

深入讲解S32DS使用过程中如何从零开始配置CAN通信,涵盖关键步骤与实用技巧,帮助开发者快速上手S32DS使用中的常见问题与调试方法。

weixin_42405592的博客 1126

数据库1:数据库创建与管理(头歌云课)

在 Windows 系统中,可以直接通过 SQLServer 的应用程序连接数据库,不过很多时候在生产环境下,我们需要通过命令行来连接数据库。两个数据库,数据库名分别为 TestDb 和 MyDb 的数据库,注意先后顺序。为了完成本关任务,你需要掌握:1.如何在 Linux 系统中连接 SQLServer 数据库,2.如何创建数据库。连接的数据库是本地数据库,用户名是 sa ,密码是 '

weixin_60530224的博客 2315

C语言实现:删除链表倒数第k个元素

删链表倒数第k个元素

m0_57180439的博客 717

铭飞MCMS源码部署

文章目录前言一、下载铭飞源码二、部署源码1.使用IDEA打开源码2.配置tomcat环境2.1下载tomcat并测试是否可以成功启动(此处不赘述)2.2在IDEA中安装tomcat环境并配置3.添加数据库,并配置3.1新建数据库3.2 导入sql配置三、启动测试 前言 铭飞MCMS基于IDEA、tomcat和mysql的环境搭建。 提示:以下是本篇文章正文内容,下面案例可供参考 一、下载铭飞源码 gitee:https://gitee.com/mingSoft/MCMS/releases(各种版本按需下

MARS_ZORO的博客 4066

查找链表的倒数第k个结点(只能遍历一次结点),删除链表的倒数第k个结点。

查找链表的倒数第k个结点   方法:设置两个指针fast,slow        让快指针先走k步,随后两个指针一起向后移动,当快指针为空时,慢指针指向的结点即为链表的倒数第k个结点。 linklist * FindLastKNode(linklist *head,int k) { linklist *fast = head; linklist *slow = head; ...

zhao_miao的博客 905

【低空经济】低空无人驾驶航空器运行管理系统设计方案

低空无人驾驶航空器运行管理系统(以下简称“系统”)旨在为低空域内的无人驾驶航空器(UAV)提供高效、安全、智能的运行管理服务。系统通过集成先进的通信、导航、监控、数据处理和人工智能技术,实现对低空域内无人驾驶航空器的实时监控、动态调度、风险评估和应急响应,确保其在复杂空域环境中的安全运行。系统的核心功能包括空域管理、飞行计划审批、实时监控、冲突预警、应急管理和数据分析。空域管理模块负责划分和管理低空域资源,确保不同飞行任务之间的空域隔离和高效利用。

2502_92579126的博客 1140

电磁兼容标准体系解析:从基础到认证的完整指南

本文系统解析了电磁兼容(EMC)标准体系,从基础概念到认证流程提供完整指南。文章阐述了EMC对于产品可靠性与市场准入的重要性,详细拆解了基础标准、通用标准、产品类标准及认证流程四层结构,并结合5G设备与工业控制等实战案例,为工程师提供了从设计初期到认证测试的高效应用策略。

weixin_29294975的博客 355

利用双指针一次遍历实现”找到“并”删除“单链表倒数第K个节点(力扣题目为例)

利用双指针一次遍历实现”找到“并”删除“单链表倒数第K个节点(力扣题目为例)

LNsupermali的博客 465

基于FPGA的UDP 通信(一)

手头的FPGA开发板上有一个千兆网口,最近准备做一下以太网通信的内容。本文先介绍基本的理论知识。 FPGA芯片型号:xc7a35tfgg484-2 网口芯片:RTL8211 网络接口:RJ45

记录所学,分享知识,结识挚友 8359

【数据结构与算法】8道链表面试真题超详剖析,带你领略算法思想【附思路、动图、源码】

💛 前情提要💛 本章节是数据结构的链表的相关基础题目讲解~ 以下的内容一定会让你对链表相关知识的题目,有一个颠覆性的认识哦!!! ❗以下内容以C语言的方式实现❗ 以下内容干货满满,跟上步伐吧~ 作者介绍: 🎓 作者: 热爱编程不起眼的小人物🐐 🔎作者的Gitee:代码仓库 📌系列文章&专栏推荐: 《刷题特辑》、 《C语言学习专栏》、《数据结构_初阶》 📒我和大家一样都是初次踏入这个美妙的“元”宇宙🌏 希望在输出知识的同时,也能与大家共同进步、无限进步🌟 📌导航小助手📌👉前情提要📒面试真题【

Dream_Y.ocean的博客 1562

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【链表】链表常见笔试题和面试题(C语言)

本文为链表常见的笔试题和面试题,包含链表反转、判断链表是否有环、查找环形入口、查找公共结点、合并两个有序链表、查找倒数第K个结点、查找中间结点、删除有序链表重复结点

HongKnight的博客 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【LeetCode】【数据结构】单链表OJ常见题型(一)

欢迎大家📂收藏📂以便未来做题时可以快速找到链表解题思路,巧妙的方法可以事半功倍。

℉f的博客 1548

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

数据结构初阶——链表习题练

n-1,n,定义慢指针定义头结点(1),快指针定义和慢指针差k(3),然后快慢指针步长相同的走,到最后n或NULL都行,只要注意一下差异就行(选n倒数k节点是慢指针位置的下一个,选NULL倒数K节点就是慢指针位置)开玩笑的,觉得不没帮助就不用了))我的经验尚浅,内容可能有许多不足和错误,所以我真诚地欢迎各位大佬提出宝贵的意见和建议。当到n的时候停止递归,n的next指向n-1,即n-1->next->next = n-1。题目描述:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

nulixiaoxuetu的博客 1107

C语言:链表中倒数第k个节点

一般思路: 先遍历链表,计算出链表中的元素个数n,倒数第k个元素是正数第n-k+1个元素,因此再遍历一次链表即可。 Linknode* FindthToTail(Linknode* head, unsigned int k) { if ((head == NULL) || (k = 0)) return NULL; int count = 0; Linknode* pointer = ...

weixin_43936250的博客 1708

2024年最全【数据结构 C语言版】第三篇 单链表习题_数据结构c语言 单链表题

(1)创建两个哨兵结点,一个哨兵结点(暂且叫它lessGuard)后面插入的是小于x值的结点,另一个哨兵结点(叫它greaterGuard)后面插入的是大于x值的结点。b.通过a步骤的遍历,分别求出两个链表的长度,然后 长度长的链表先走差距步(两个链表的长度差)。走完之后,同时走,第一个地址相等的结点就是相交结点。(2)先找到要删除结点的前一个结点,然后前一个结点的next更新为要删除结点的next,释放要被删除的结点。(1)可以先用快慢指针,找出链表的中间点,然后将后半段链表反转,最后两个链表进行比较。

2401_84181911的博客 886

链表经典面试题

1.删除链表中等于给定值的所有结点1.删除链表中等于给定值的所有结点2.反转一个单链表这里我们需要在原链表中进行操作我们定义三个指针如下图所示:接下来就是改变l2指针的next指向l1之后l1指针走到l2,l2走到l3,l3走到l2的next,不断循环一直到l2为空指针这里有一个小细节如下图。

GOATLong的博客 3069

【Leetcode刷题(数据结构)】:单向链表

给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点输入:head = [1,2,6,3,4,5,6], val = 6输出:[1,2,3,4,5]示例 2:输入:head = [ ], val = 1输出:[ ]示例 3:输入:head = [7,7,7,7], val = 7输出:[ ]思路如下见详细代码上述注释掉的代码是我在写的时候犯的错误,大家也可以试着自己写写看会不会和我犯同样的错误。

优快云官方认证C/C++研发领域优质创作者 优快云官方2023年成都赛道Top3 第16届蓝桥杯C/C++软件赛四川赛区二等奖 带你玩转C/C++ 数据结构与算法 Linux系统编程/Linux网络编程 MySQL数据库 软件测试开发 971

【数据结构与算法】一套链表 OJ 带你轻松玩转链表

十道链表OJ轻松上手,拓宽你对链表的认知

bit me的博客 2157

c++(练习题)————删除单链表倒数第k个结点

题目描述: 给定一个链表,删除链表的倒数第 k 个节点,并且返回链表的头结点。 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5. 说明:给定的 n 保证是有效的。 进阶:你能尝试使用一趟扫描实现吗? 题目分析: 不使用额外空间,且一次遍历删除节点; 使用双指针,...

djh的博客 1331

链表OJ题目合集第一弹:移除元素,反转链表,中间结点,倒数第k个结点,合并有序链表,回文结构,相交链表判断。(C语言版,有详细解析、图示和链接)

这次七道链表OJ题目的解析可以说是干货满满,。每做一道题,可以参考上面的图示来分析理解思路,多画图有助于你思路顺畅,后期写代码不卡壳。事后可以尝试自己总结其中用到的方法,话不多说,练起来!创作不易,希望这篇文章能给你带来启发和帮助,如果喜欢这篇文章,请留下你的三连哦,你的支持的我最大的动力!!!

2301_79171011的博客 1078

C语言单链表OJ题(较易)

在数据结构的新篇章里,注意的小细节更多,最好将能考虑的情况都要考虑到,不然调试起来比较麻烦。

可涵的博客 696

删除单链表倒数第k个结点

删除单链表倒数第k个结点在数据结构这一方面,链表这块容易搞混的是它的指针。下面的算法为删除单链表倒数第k个结点,所有的步骤解析都在代码里说明了。/** * 删除单链表的倒数第K个结点. */ //结点定义 class Node{ int val; Node next; public Node(int val){ this.val = val; ...

xsxhurryup的博客 761
上一篇: 链表——删除非尾结点、某个结点位置插入值为data的结点(不能遍历链表)
下一篇: 数据结构——链表逆置!
Code_zx
博客等级 码龄9年 83粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值