【初阶数据结构】——leetcode:返回链表的倒数第K个结点

文章目录

  • [1. 题目介绍](#1. 题目介绍)
  • [2. 思路分析------快慢指针](#2. 思路分析——快慢指针)
  • [3. 代码实现](#3. 代码实现)

1. 题目介绍

链接: link

给我们一个单链表,返回其中倒数第K个结点的值。

2. 思路分析------快慢指针

思路:快慢指针。
定义两个指针fast和slow。快指针fast先走K步,然后fast和slow同时走。当fast走到NULL的时候,slow就处在倒数第K个结点的位置。

可以画个图带大家看一下:

比如这个链表

现在我们要返回倒数第3(K=3)个结点,即4。
我们来分析一下

当然还有另外一种走法:先让fast走K-1步,然后两者同步走,这样的话就是fast走到最后一个结点的时候(fast->next==NULL)结束。

两种方法都差不多,我们来写一下代码

3. 代码实现

fast先走K步:



🆗,通过了

cpp 复制代码
int kthToLast(struct ListNode* head, int k){
    struct ListNode* slow=head;
    struct ListNode* fast=head;
    while(k--)
    {
        fast=fast->next;
    }
    while(fast)
    {
        fast=fast->next;
        slow=slow->next;
    }
    return slow->val;
}

如果fast先走K-1步:


注意先走K步,第二个while循环结束的条件就是fast->next==NULL

也是可以通过的。

cpp 复制代码
int kthToLast(struct ListNode* head, int k){
    struct ListNode* slow=head;
    struct ListNode* fast=head;
    while(--k)
    {
        fast=fast->next;
    }
    while(fast->next)
    {
        fast=fast->next;
        slow=slow->next;
    }
    return slow->val;
}

当然还想给大家提一点就是:

这道题题目中已经明确指出给定的 k 保证是有效的。
如果题目没有这样说的话,那么就需要考虑K可能大于链表的长度,但对于这种情况我们要进行一个判断。
因为如果K大于链表长度

那第一个循环中fast就会走到NULL,你再去访问它的next,那就是对空指针解引用了,程序就会出错了。

相关推荐
CSharp精选营4 天前
关系型 vs 非关系型:从原理到选型,一文搞定数据库核心分类
数据结构·nosql·关系型数据库·非关系型数据库·技术选型
To_OC5 天前
LC 207 课程表:刚学图论那会儿,我连这是拓扑排序都没看出来
javascript·算法·leetcode
To_OC5 天前
LC 208 实现 Trie 前缀树:曾被名字劝退,写完发现是送分题
javascript·算法·leetcode
To_OC6 天前
LC 994 腐烂的橘子:人人都说是 BFS 入门题,我却写了三遍才过
javascript·算法·leetcode
To_OC6 天前
LC 200 岛屿数量:经典 DFS 入门题,我第一次写居然连方向都搞错了
javascript·算法·leetcode
To_OC7 天前
LC 128 最长连续序列:别上来就排序,O (n) 解法才是这题的灵魂
javascript·算法·leetcode
刘马想放假7 天前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
北域码匠8 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
To_OC9 天前
LC 49 字母异位词分组:想到哈希表很简单,选对 key 才是精髓
javascript·算法·leetcode
To_OC10 天前
LC 1 两数之和:面试第一道必考题,暴力解法直接被面试官 pass
javascript·算法·leetcode