中国空间站朋友圈,珠海专业网站制作公,wordpress英文版语言包,理卖做各视频网站的会员#x1f525;小龙报#xff1a;个人主页 #x1f3ac;作者简介#xff1a;C研发#xff0c;嵌入式#xff0c;机器人等方向学习者 ❄️个人专栏#xff1a;《C语言》《【初阶】数据结构与算法》 ✨ 永远相信美好的事情即将发生 文章目录前言一、返回倒数第k个节点1.1题目…小龙报个人主页作者简介C研发嵌入式机器人等方向学习者❄️个人专栏《C语言》《【初阶】数据结构与算法》✨永远相信美好的事情即将发生文章目录前言一、返回倒数第k个节点1.1题目1.2 算法原理1.3 代码二、相交链表2.1 题目2.2 算法原理2.3 代码三、回文链表3.1 题目3.2 算法原理3.3 代码总结与每日励志前言链表作为数据结构的基础核心是算法面试与嵌入式开发中高频考察的重点。本文聚焦三道经典链表真题通过快慢指针、链表反转等核心技巧拆解倒数第 k 个节点、回文链表与相交链表的解题逻辑结合代码实现与避坑指南助力高效掌握链表解题思维。一、返回倒数第k个节点1.1题目链接返回倒数第k个节点1.2 算法原理核心思想:类快慢指针定义两个指针slow和fast让fast先走k步使得fast与slow始终相差k当fast走到NULL时slow便是指向链表的倒数第k个节点1.3 代码/***Definitionforsingly-linked list.*struct ListNode{*int val;*struct ListNode*next;*};*/typedef struct ListNode*ListNode;intkthToLast(struct ListNode*head,int k){ListNode slowhead;ListNode fasthead;while(k--)fastfast-next;while(fast){fastfast-next;slowslow-next;}returnslow-val;}二、相交链表2.1 题目链接相交链表注这道题是以进阶的要求来做的2.2 算法原理核心思想寻找中间节点 反转链表寻找中间节点然后反转中间节点以及中间节点后的链表节点此时链表的尾节点成为新的中间节点用头节点开始与中间节点开始比较遍历两部分链表即可如何寻找中间节点核心思想快慢指针2*slow fast注意不能fast-next fast当遇到偶数链表会造成对空指针解应用如何反转链表2.3 代码/***Definitionforsingly-linked list.*struct ListNode{*int val;*struct ListNode*next;*};*/typedef struct ListNode*ListNode;//寻找中间节点 ListNodeseek_mid(ListNode head){ListNode slowhead;ListNode fasthead;//慢指针走一步快指针走两步while(fastfast-next){slowslow-next;fastfast-next-next;}returnslow;}//逆置 ListNodereserve_mid(ListNode head){ListNode n1NULL;ListNode n2head;ListNode n3head-next;while(n2){n2-nextn1;n1n2;n2n3;if(n3)n3n3-next;}returnn1;}boolisPalindrome(struct ListNode*head){//寻找中间节点 ListNode midseek_mid(head);//逆置 ListNode rmidreserve_mid(mid);ListNode curhead;while(currmid){if(cur-val!rmid-val)returnfalse;curcur-next;rmidrmid-next;}returntrue;}三、回文链表3.1 题目链接回文链表3.2 算法原理题目的核心问题链表是否相交 相交如何找到相交节点1 如何链表是否相交— 链表相交尾节点必定相同2 如何找到相交节点 — 在两个链表寻找尾节点时统计两个链表的长度判断做差让长的链表先走相差的步数使得两个链表长度一致然后遍历两个链表判断相交节点即可。注在判断时不管是尾部节点还是相交节点都应该是判断地址而不是数值因为节点存储的值可能一致从而导致判断错误。3.3 代码/***Definitionforsingly-linked list.*struct ListNode{*int val;*struct ListNode*next;*};*/typedef struct ListNode*ListNode;struct ListNode*getIntersectionNode(struct ListNode*headA,struct ListNode*headB){ListNode cur1headA;ListNode cur2headB;int lena1,lenb1;//判断尾节点是否相同while(cur1-next){lena;cur1cur1-next;}while(cur2-next){lenb;cur2cur2-next;}if(cur1!cur2)returnNULL;int gapabs(lena-lenb);ListNode shortlistheadA;ListNode longlistheadB;if(lenalenb){shortlistheadB;longlistheadA;}//让长的先走追平链表长度while(gap--)longlistlonglist-next;while(longlist!shortlist){longlistlonglist-next;shortlistshortlist-next;}returnlonglist;}总结与每日励志✨本文梳理了三类链表问题的最优解法核心在于灵活运用指针策略简化操作同时需注重空指针等边界条件的处理。每一次代码调试的突破都是逻辑思维的进阶。2026 年愿你在技术之路上步步为营深耕不辍用坚持敲开梦想的大门永远相信美好的事情即将发生