【数据结构和算法】链表的综合算法练习: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

《C++进阶之STL》【红黑树】

《C++进阶之STL》【红黑树】

【红黑树】目录 * 前言: * ------------概念介绍------------ * 1. 什么是红黑树? * 2. 红黑树的基本特性是什么? * 3. 红黑树的效率怎么样? * 4. 红黑树如何确保最长路径不超过最短路径的2倍? * ------------基本操作------------ * 一、查找操作 * 二、插入操作 * 1. 本质 * 2. 步骤 * 情况1:变色 * 情况2:变色 + 单旋 * 情况3:变色 + 双旋 * 三、验证操作 * ------------代码实现------------ * 红黑树的存储结构是什么样的? * 一、节点的存储结构 * 二、树的存储结构 * 实现文件:RBTree.h * 测试文件:Test.cpp * 运行结果: * ------------终极对决------------ * 一、选手登场 * AVL树的源代码 * 红黑树的源代码 * 二、

By Ne0inhk

C++内核启动太慢?这4种静态配置优化方法你必须掌握

第一章:C++内核配置静态优化与启动加速概述 在现代高性能系统开发中,C++常被用于构建对启动速度和运行效率要求极高的内核级组件。通过对编译期配置的精细控制与静态优化策略的应用,可显著减少初始化开销,提升程序冷启动性能。这一过程不仅涉及编译器优化选项的合理选择,还包括对模板实例化、静态构造函数以及链接时优化(LTO)等机制的深度利用。 静态优化的核心技术手段 * 启用链接时优化以消除未使用的代码段 * 使用 -fvisibility=hidden 减少符号导出开销 * 通过 constexpr 和模板元编程将计算前移至编译期 * 禁用异常与RTTI以降低运行时支持成本 关键编译选项配置示例 # 启用全面优化与链接时优化 g++ -O3 -flto -fwhole-program \ -fvisibility=hidden -DNDEBUG \ -fno-exceptions -fno-rtti \ -o kernel core.cpp runtime.cpp 上述指令组合通过开启LTO(-flto)实现跨编译单元优化,同时关闭异常处理和类型信息以精简二进制体积,适

By Ne0inhk
CCF-GESP 等级考试 2025年9月认证C++一级真题解析

CCF-GESP 等级考试 2025年9月认证C++一级真题解析

2025年9月真题 一、单选题(每题2分,共30分) 正确答案:D 考察知识点:计算机相关知识 解析:在人工智能领域,“大模型” 最贴切的通常是指大语言模型。大语言模型是基于大规模文本数据训练的,能够理解和生成自然语言等内容,像常见的 ChatGPT 等就属于大语言模型范畴。而选项 A “大电脑模型” 表述不准确;选项 B “大规模智能” 不是对 “大模型” 的准确指代;选项 C “智能的单位” 也不符合 “大模型” 的定义。答案为D。 正确答案:C 考察知识点:流程控制语句 解析:计算 1 到 10001 之间的所有偶数和,需要重复累加操作(循环结构),且需判断是否为偶数(分支结构)。仅用顺序结构无法实现重复操作和条件判断,

By Ne0inhk
【C++指南】STL容器的安全革命:如何封装Vector杜绝越界访问与迭代器失效?

【C++指南】STL容器的安全革命:如何封装Vector杜绝越界访问与迭代器失效?

🌟 各位看官好,我是egoist2023! 🌍 种一棵树最好是十年前,其次是现在! 🚀 使用STL的三个境界:能用,明理,能扩展 👍 如果觉得这篇文章有帮助,欢迎您一键三连,分享给更多人哦! 了解vector常用接口 vector是C++标准模板库中的部分内容,中文偶尔译作“容器”,但并不准确。它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。 常见构造 (constructor)构造函数声明接口说明vector()(重点)无参构造vector(size_type n, const value_type& val = value_type())构造并初始化n个valvector (const vector& x); (重点)拷贝构造vector (InputIterator first, InputIterator last)

By Ne0inhk