【数据结构和算法】链表的综合算法练习:1.返回倒数第k个节点 2.相交链表 3.回文链表

【数据结构和算法】链表的综合算法练习:1.返回倒数第k个节点 2.相交链表 3.回文链表
在这里插入图片描述
🔥小龙报:个人主页
🎬作者简介:C++研发,嵌入式,机器人等方向学习者
❄️个人专栏:《C语言》《【初阶】数据结构与算法》
永远相信美好的事情即将发生
在这里插入图片描述

文章目录


前言

链表作为数据结构的基础核心,是算法面试与嵌入式开发中高频考察的重点。本文聚焦三道经典链表真题,通过快慢指针、链表反转等核心技巧,拆解倒数第 k 个节点、回文链表与相交链表的解题逻辑,结合代码实现与避坑指南,助力高效掌握链表解题思维。

一、返回倒数第k个节点

1.1题目

链接:返回倒数第k个节点

在这里插入图片描述

1.2 算法原理

核心思想: 类快慢指针,定义两个指针slow和fast让fast先走k步使得fast与slow始终相差k当fast走到NULL时slow便是指向链表的倒数第k个节点

1.3 代码

/*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;*};*/ typedef struct ListNode* ListNode; int kthToLast(struct ListNode* head, int k){ ListNode slow = head; ListNode fast = head;while(k--) fast = fast->next;while(fast){ fast = fast->next; slow = slow->next;}return slow->val;}

二、相交链表

2.1 题目

链接:相交链表

在这里插入图片描述
注: 这道题是以进阶的要求来做的

2.2 算法原理

核心思想: 寻找中间节点 + 反转链表
寻找中间节点然后反转中间节点以及中间节点后的链表节点,此时链表的尾节点成为新的中间节点,用头节点开始与中间节点开始比较,遍历两部分链表即可

如何寻找中间节点
核心思想:快慢指针(2*slow == fast)

注意:不能fast->next && fast当遇到偶数链表会造成对空指针解应用
如何反转链表?

2.3 代码

/*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;*};*/ typedef struct ListNode* ListNode;//寻找中间节点 ListNode seek_mid(ListNode head){ ListNode slow = head; ListNode fast = head;//慢指针走一步,快指针走两步 while(fast && fast->next){ slow = slow->next; fast = fast->next->next;}return slow;}//逆置 ListNode reserve_mid(ListNode head){ ListNode n1 =NULL; ListNode n2 = head; ListNode n3 = head->next;while(n2){ n2->next = n1; n1 = n2; n2 = n3;if(n3) n3 = n3->next;}return n1;} bool isPalindrome(struct ListNode* head){//寻找中间节点 ListNode mid =seek_mid(head);//逆置 ListNode rmid =reserve_mid(mid); ListNode cur = head;while(cur && rmid){if(cur->val != rmid -> val)returnfalse; cur = cur->next; rmid = rmid->next;}returntrue;}

三、回文链表

3.1 题目

链接:回文链表

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

3.2 算法原理

题目的核心问题: 链表是否相交? + 相交如何找到相交节点?
(1) 如何链表是否相交?— 链表相交尾节点必定相同
(2) 如何找到相交节点? — 在两个链表寻找尾节点时统计两个链表的长度,判断做差,让长的链表先走相差的步数,使得两个链表长度一致,然后遍历两个链表判断相交节点即可。

注: 在判断时不管是尾部节点还是相交节点都应该是判断地址而不是数值,因为节点存储的值可能一致从而导致判断错误。

3.3 代码

/*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;*};*/ typedef struct ListNode* ListNode; struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB){ ListNode cur1 = headA; ListNode cur2 = headB; int lena =1,lenb =1;//判断尾节点是否相同 while(cur1->next){ lena++; cur1 = cur1->next;}while(cur2->next){ lenb++; cur2 = cur2->next;}if(cur1 != cur2)returnNULL; int gap =abs(lena - lenb); ListNode shortlist = headA; ListNode longlist = headB;if(lena >lenb){ shortlist = headB; longlist = headA;}//让长的先走追平链表长度 while(gap--) longlist = longlist->next;while(longlist != shortlist){ longlist = longlist->next; shortlist = shortlist->next;}return longlist;}

总结与每日励志

本文梳理了三类链表问题的最优解法,核心在于灵活运用指针策略简化操作,同时需注重空指针等边界条件的处理。每一次代码调试的突破,都是逻辑思维的进阶。2026 年,愿你在技术之路上步步为营,深耕不辍,用坚持敲开梦想的大门,永远相信美好的事情即将发生!

在这里插入图片描述

Read more

基于Java+SSM+Flask车辆出租管理系统(源码+LW+调试文档+讲解等)/车辆租赁管理/汽车出租软件/车辆出租平台/租车管理系统/车辆租赁系统/汽车租赁解决方案/车辆出租服务/车辆出租程序

基于Java+SSM+Flask车辆出租管理系统(源码+LW+调试文档+讲解等)/车辆租赁管理/汽车出租软件/车辆出租平台/租车管理系统/车辆租赁系统/汽车租赁解决方案/车辆出租服务/车辆出租程序

博主介绍 💗博主介绍:✌全栈领域优质创作者,专注于Java、小程序、Python技术领域和计算机毕业项目实战✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 2025-2026年最新1000个热门Java毕业设计选题大全✅ 2025-2026年最新500个热门微信小程序毕业设计选题大全✅ Java毕业设计最新1000套项目精品实战案例 微信小程序毕业设计最新500套项目精品案例 🌟文末获取源码+数据库🌟 感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人 本文项目技术选型介绍 前端:Flask、Python Web框架,后端语言Python 后端:Spring+SpringMVC+Mybatis 数据库:MySQL、SQLServer 开发工具:IDEA、Eclipse、Navicat等 ✌关于毕设项目技术实现问题讲解也可以给我留言咨询!!! 详细视频演示 请联系博主获取更详细的演示视频-源码编号2611 具体实现截图 框架介绍 前端技术介绍 在程序设计的测试方面,Flask 也提供了良好的支持。程

By Ne0inhk
【从0开始学习Java | 第23篇】动态代理

【从0开始学习Java | 第23篇】动态代理

文章目录 * Java动态代理概述 * 一、动态代理的核心概念 * 形象解释 * 二、两种主流动态代理实现 * 1. JDK动态代理(基于接口) * 原理 * 示例代码 * 优缺点 * 2. CGLIB动态代理(基于子类) * 原理 * 示例代码(需引入CGLIB依赖) * 优缺点 * 三、JDK与CGLIB动态代理对比 * 四、实际应用场景 * 五、总结 Java动态代理概述 在Java开发中,代理模式设计模式之一,而动态代理作为代理模式的进阶形式,在框架开发(如Spring AOP)、日志记录、权限控制等场景中发挥着关键作用。本文将从核心概念出发,拆解两种主流动态代理的实现逻辑,并分析其适用场景。 一、动态代理的核心概念 动态代理指在程序运行时,通过反射机制动态生成代理类,而非在编译期预先定义。其核心价值在于:无需为每个目标类手动编写代理类,即可统一为多个目标类添加横切逻辑(如日志、事务、异常处理),降低代码耦合度。

By Ne0inhk
从零开始学java--二叉树和哈希表

从零开始学java--二叉树和哈希表

数据结构基础 目录 数据结构基础 树 树形结构: 树的概念: 二叉树 概念: 两种特殊的二叉树: 二叉树的性质: 创建一个简单的二叉树: 二叉树的遍历 前序遍历: 中序遍历: 后序遍历: 层序遍历: 二叉查找树和平衡二叉树 二叉查找树: 平衡二叉树: 红黑树 哈希表 树 树形结构: 树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: 1. 有一个特殊的结点,称为根结点,根结点没有前驱结点。 2. 除根结点外,其余结点被分成M(M > 0)个互不相交的集合T1、T2、......、Tm,其中每一个集合Ti (1 <= i

By Ne0inhk

VSCode中如何搭建JAVA+MAVEN开发环境?

一、前置条件(必须先安装) 在配置 VSCode 的 Maven 环境前,需要先安装好以下工具: 1. JDK(推荐 JDK 8/11/17,Maven 对新版本 JDK 兼容性较好) 2. Maven(官网下载 /apache-maven-3.6 + 版本) 3. 配置环境变量: * 配置JAVA_HOME(指向 JDK 安装目录) * 配置MAVEN_HOME(指向 Maven 安装目录) * 把%MAVEN_HOME%\bin和%JAVA_HOME%\bin添加到系统Path中 * 验证:打开终端执行 java -version 和

By Ne0inhk