Leetcode刷题笔记之链表篇剑指 Offer 22. 链表中倒数第k个节点
Posted 大家好我叫张同学
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode刷题笔记之链表篇剑指 Offer 22. 链表中倒数第k个节点相关的知识,希望对你有一定的参考价值。
😈博客主页:🐼大家好我叫张同学🐼
💖 欢迎点赞 👍 收藏 💗留言 📝 欢迎讨论! 👀
🎵本文由 【大家好我叫张同学】 原创,首发于 CSDN 🌟🌟🌟
✨精品专栏(不定时更新) 【数据结构+算法】 【做题笔记】【C语言编程学习】
☀️ 精品文章推荐
【C语言进阶学习笔记】三、字符串函数详解(1)(爆肝吐血整理,建议收藏!!!)
【C语言基础学习笔记】+【C语言进阶学习笔记】总结篇(坚持才有收获!)
前言 |
为什么要写
刷题笔记
?
写博客
的过程也是对自己刷题过程的梳理
和总结
,是一种耗时
但有效
的方法。
当自己分享的博客帮助到他人时,又会给自己带来额外的快乐和幸福。
(刷题的快乐+博客的快乐,简直是奖励翻倍,快乐翻倍
有木有QAQ🙈)
题目内容 |
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。
例如,一个链表有6
个节点,从头节点开始,它们的值依次是1、2、3、4、5、6
。这个链表的倒数第3
个节点是值为4
的节点。
遍历链表法 |
单链表
要求倒数第k个结点,由于结点之间关系的单向性
,并不好直接求。但是如果我们将倒数
转化为顺数
,那么仅需要从头节点开始遍历链表便可轻松实现,具体过程看图解。
算法图解 |
函数实现 |
struct ListNode* getKthFromEnd(struct ListNode* head, int k)
int length = 0;//求链表长度
struct ListNode* cur = head;
while(cur)
length++;
cur = cur->next;
cur = head;//cur重新返回头节点
int step = length-k;//第length+1-k个位置只需要向后走length-k步
while(step--)
cur = cur->next;
return cur;
注意:leetcode题目中默认k的大小是小于length的长度。若实际中这个条件未给出,那么我们则需要加上以下条件判断的代码:
if(k > length)
return NULL;
比如在牛客网中没有这个判断就无法通过,会提示你段错误。
加上判断语句后
struct ListNode* FindKthToTail(struct ListNode* pListHead, int k )
// write code here
int length = 0;//求链表长度
int step = 0;
struct ListNode* cur = pListHead;
while(cur)
length++;
cur = cur->next;
if(k > length)
return NULL;
cur = pListHead;//cur重新返回头节点
step = length-k;//第length+1-k个位置只需要向后走length-k步
while(step--)
cur = cur->next;
return cur;
快慢指针法 |
我们还可以用快慢指针法来求链表中倒数第k个结点,可以先让
快指针
fast先走k步
,然后快慢指针
(fast、slow)一起往后走
,当快指针
fast走到最后的NULL
位置时,慢指针
刚好走到倒数第k个
位置。
算法图解 |
函数实现 |
struct ListNode* getKthFromEnd(struct ListNode* head, int k)
struct ListNode *fast = head,*slow = head;
while(k--)//fast先走k步
fast = fast->next;
while(fast)//fast、slow一起往后走
fast = fast->next;
slow = slow->next;
return slow;
如果是在牛客网上做这道题目,那么我们使用快慢指针法的时候,还需要多考虑一些边界的情况,对上述代码进行相应调整如下:
struct ListNode* FindKthToTail(struct ListNode* pListHead, int k )
struct ListNode *fast = pListHead,*slow = pListHead;
if(k == 0)//这里加了k=0的条件判断
return NULL;
while(k--)//fast先走k步
if(fast == NULL)//这里加了fast提前走到NULL的判断
return NULL;
fast = fast->next;
while(fast)//fast、slow一起往后走
fast = fast->next;
slow = slow->next;
return slow;
以上是关于Leetcode刷题笔记之链表篇剑指 Offer 22. 链表中倒数第k个节点的主要内容,如果未能解决你的问题,请参考以下文章