02.02、返回倒数第 k 个节点

02.02、[简单] 返回倒数第 k 个节点

1、题目描述

实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。

2、题解思路

本题的关键在于使用双指针法 ,通过两个指针(fastslow),让 fast 指针比 slow 指针先走 k 步,这样当 fast 到达链表末尾时,slow 正好指向倒数第 k 个节点。

具体步骤如下:

  1. 初始化两个指针 fastslow,都指向链表的头节点。
  2. fast 先走 k 步,使得 fastslow 之间的距离为 k
  3. 同时移动 fastslow,直到 fast 到达链表的末尾。
  4. 此时,slow 指针所指向的节点就是倒数第 k 个节点,返回该节点的值。

3、详细代码解析

class Solution {
public:
    int kthToLast(ListNode* head, int k) {
        // 初始化两个指针,分别指向链表的头节点
        ListNode* fast = head;
        ListNode* slow = head;

        // 让 fast 指针先走 k 步
        while (k--) {
            fast = fast->next;
        }

        // 同时移动 fast 和 slow,直到 fast 到达链表的末尾
        // 当 fast 到达链表末尾时,slow 则正好指向倒数第 k 个节点,返回该节点的值
        while (fast) {
            fast = fast->next;
            slow = slow->next;
        }

        // slow 现在指向倒数第 k 个节点,返回该节点的值
        return slow->val;
    }
};

4、时间复杂度与空间复杂度

  • 时间复杂度O(n),其中 n 为链表的长度。由于我们只遍历了链表一次,因此时间复杂度是线性的。
  • 空间复杂度O(1),只用了两个指针,空间开销很小。

通过使用双指针技巧,我们可以在一次遍历中高效地找到倒数第 k 个节点。这个解法在不需要额外空间的情况下,能够很好地解决问题。

相关推荐
skaiuijing5 分钟前
Sparrow系列拓展篇:对信号量应用问题的深入讨论
c语言·开发语言·算法·中间件·操作系统
灰末21 分钟前
[第15次CCFCSP]数据中心
数据结构·c++·算法·图论·kruskal
Qhumaing23 分钟前
C/C++学习-引用
c语言·c++·学习
qystca25 分钟前
洛谷 P1049 [NOIP2001 普及组] 装箱问题 C语言 记忆化搜索->‘倒序‘dp->‘正序‘dp
c语言·数据结构·算法
thesky12345642 分钟前
活着就好20241126
学习·算法
_小柏_1 小时前
C/C++基础知识复习(28)
c语言·c++
一只鸡某1 小时前
实习冲刺第三十一天
数据结构·c++·算法·leetcode·排序算法
牙牙要健康1 小时前
【深度学习】【RKNN】【C++】模型转化、环境搭建以及模型部署的详细教程
c++·人工智能·深度学习
AICodeThunder1 小时前
C++知识点总结(58):序列型动态规划
开发语言·c++·动态规划
无限大.2 小时前
C++ String
java·开发语言·c++