【算法专题–链表】链表中倒数第 K 个节点(图文详解,小白一看就懂!!!)
目录
一、前言
二、题目描述
三、解题方法
⭐双指针 — 快慢指针
🍑 思路一
🍑 思路二
四、总结与提炼
五、共勉
一、前言
链表中倒数第 K 个节点这道题,可以说是–链表专题–,最经典的一道题,也是在面试中频率最高的一道题目,通常在面试中,面试官可能会从多个方面考察这道题目,所以大家需要对这道题目非常熟悉哦!!
本片博客就来详细的讲讲解一下 链表中倒数第 K 个节点 的实现方法,让我们的面试变的更加顺利!!!
二、题目描述
给定一个头节点为
head
的链表用于记录一系列核心肌群训练项目编号,请查找并返回倒数第 K 个训练项目编号。
三、解题方法
这道题的解法还是可以用 快慢指针,但是稍微有点点不同。
⭐双指针 — 快慢指针
🍑 思路一
慢指针 slow 和 快指针 fast 一开始都指向头节点:
(1)fast 先走 k 步;
(2)slow 和 fast 同时走,fast 走到 NULL 时,slow 就是 倒数第 k 个。
假设链表元素为 1、2、3、4、5,要求输出该链表中倒数第 2 个结点,如图所示👇
这里直接动图演示循环的过程👇
🍑 思路二
慢指针 slow 和 快指针 fast 一开始都指向头节点:
(1)fast 先走 k-1 步;
(2)slow 和 fast 同时走,fast 走到 尾节点 时,slow 就是 倒数第 k 个。
假设链表元素为 1、2、3、4、5,要求输出该链表中倒数第 2 个结点,如图所示👇
这里还是直接动图演示循环的过程👇
注意:如果 k 大于链表的长度,那么直接返回 NULL
代码:
class Solution {
public:
ListNode* trainingPlan(ListNode* head, int cnt)
{
// 定义快慢指针
ListNode* slow, *fast;
// 开始都指向 头节点
slow = fast = head;
// fast 先走 cnt步
while(cnt--)
{
// 如果 cnt 大于链表长度 ,那么直接返回 nullptr
if(fast==nullptr)
{
return nullptr;
}
fast = fast->next;
}
// 当 fast 不为空指针时
while(fast->next)
{
// slow 和 fast 同时走
slow = slow->next;
fast = fast->next;
}
// 当 fast 为 空指针 ,跳出循环,返回 slow
return slow->next;
}
};
四、总结与提炼
最后我们来总结一下本文所介绍的内容,本文讲解来一道力扣中有关 链表中倒数第 K 个节点的题目,这道题目是校招笔试面试中有关链表章节非常高频的一道题目,大家下去一定要自己再画画图,分析一下,把这段代码逻辑自己实现一遍,才能更好地掌握
五、共勉
以下就是我对 链表中倒数第 K 个节点 的理解,如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对 链表专题 的理解,请持续关注我哦!!!