【数据结构和算法】链表的综合算法练习: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++之旅-C++11的深度剖析(1)

C++之旅-C++11的深度剖析(1)

目录 前言/背景 1.C++11的发展历史  2.列表初始化 2.1 C++98传统的{} 2.2 C++11中的{} 2.3 C++11中的std::initializer_list 3.右值引用 3.1 左值和右值 3.2 左值引用和右值引用 3.3 引用延长生命周期 3.4 左值和右值的参数匹配 结束语 前言/背景 随着现代软件开发的快速发展,编程语言也在不断进化,C++ 作为一种功能强大的编程语言,已经经历了多个版本的更新,每一次版本的发布都为开发者带来了新的特性和功能。C++11 是 C++ 语言的一个重要版本,

By Ne0inhk
深入解剖STL map/multimap:接口使用与核心特性详解

深入解剖STL map/multimap:接口使用与核心特性详解

❤️@燃于AC之乐 来自重庆 计算机专业的一枚大学生 ✨专注 C/C++ Linux 数据结构 算法竞赛 AI 🏞️志同道合的人会看见同一片风景! 👇点击进入作者专栏: 《算法画解》 ✅ 《linux系统编程》✅ 《C++》 ✅ 🌟《算法画解》算法相关题目点击即可进入实操🌟 感兴趣的可以先收藏起来,请多多支持,还有大家有相关问题都可以给我留言咨询,希望希望共同交流心得,一起进步,你我陪伴,学习路上不孤单! 文章目录 * 前言(map系列容器概述) * 一、map类介绍 * 1.1 map的类模板声明 * 二、pair类型介绍 * 2.1 pair的结构定义 * 2.2 pair的使用要点 * 三、map的构造与迭代器 * 3.1 构造接口 * 3.2 迭代器接口 * 四、map的增删查操作

By Ne0inhk
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅

C++ 继承:代码传承的魔法棒,开启奇幻编程之旅

文章目录 * 一.继承的概念及定义 * 1.1继承的概念 * 1.2继承类 * 1.2.1继承方法 * 1.3继承模板 * 二.基类和派生类的转换 * 三.继承中的作用域 * 四.派生类的默认成员函数 * 4.1默认成员函数的行为 * 4.2实现一个无法被继承的类 * 五.继承与友元 * 六.继承与静态成员 * 七.多继承和菱形继承 * 7.1多继承和菱形继承 * 7.2虚继承 * 八.总结 一.继承的概念及定义 1.1继承的概念 继承是面向对象语言特性之一,它允许一个类(派生类)从另一个类(基类)中,继承其属性和方法。这样做的好处是,提供了可以重用的代码,避免在写一个类时,它的一部分功能已经在另一个类中实现了,我们还需要在这个类中重新写一遍。

By Ne0inhk
【探寻C++之旅】第十六章:unordered系列的认识与模拟实现

【探寻C++之旅】第十六章:unordered系列的认识与模拟实现

请君浏览 * 前言 * 1. 了解unordered系列 * 1.1 初步认识 * 1.2 核心差异 * 1.3 使用示例 * 1.4 与普通 map/set的区别 * 2. 模拟实现unordered系列 * 2.1 迭代器 * 尾声 前言 今天,我们继续踏入追寻C++的冒险历程。上一章我们讲解了数据结构哈希表,那么本章让我们用哈希表来模拟实现一下C++STL中的unordered_map和unordered_set。下面让我们一起来进入本章的学习。 1. 了解unordered系列 在 C++ STL(标准模板库)中,unordered_map 和 unordered_set 是两种基于哈希表(Hash Table) 实现的关联式容器,

By Ne0inhk