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 个节点。这个解法在不需要额外空间的情况下,能够很好地解决问题。

相关推荐
沐怡旸2 分钟前
【穿越Effective C++】条款13:以对象管理资源——RAII原则的基石
c++·面试
一个不知名程序员www14 分钟前
算法学习入门---二分查找(C++)
c++·算法
2301_8079973839 分钟前
代码随想录-day26
数据结构·c++·算法·leetcode
闭着眼睛学算法1 小时前
【双机位A卷】华为OD笔试之【排序】双机位A-银行插队【Py/Java/C++/C/JS/Go六种语言】【欧弟算法】全网注释最详细分类最全的华子OD真题题解
java·c语言·javascript·c++·python·算法·华为od
TL滕1 小时前
从0开始学算法——第一天(认识算法)
数据结构·笔记·学习·算法
小欣加油1 小时前
leetcode 3318 计算子数组的x-sum I
c++·算法·leetcode·职场和发展
love is sour1 小时前
聚类(Clustering)详解:让机器自己发现数据结构
算法·支持向量机·聚类
烟袅1 小时前
LeetCode 142:环形链表 II —— 快慢指针定位环的起点(JavaScript)
前端·javascript·算法
CoovallyAIHub1 小时前
OCR战场再起风云:LightOnOCR-1B凭什么比DeepSeekOCR快1.7倍?(附演示开源地址)
深度学习·算法·计算机视觉
j_xxx404_2 小时前
C++ STL:list|了解list|相关接口|相关操作
开发语言·c++