LeetCode:返回倒数第k个结点

1、题目描述

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

注意:本题相对原题稍作改动

示例:

输入: 1->2->3->4->5 和 k = 2
输出: 4

说明:

给定的 k 保证是有效的。

2、方法1:两次遍历

  1. 第一次遍历:计算链表的长度 len

  2. 第二次遍历:从头节点开始,移动 len - k 步,到达倒数第 k 个节点。

关键步骤
  1. 计算链表长度

    • 初始化指针 curr 指向头节点 head,计数器 len = 0

    • 遍历链表,每移动一次 currlen 加 1,直到 curr 为 null

    • 最终 len 存储的是链表的节点总数。

  2. 定位倒数第 k 个节点

    • 倒数第 k 个节点就是正数第 len - k + 1 个节点。

    • 由于链表从 head 开始编号为 1,所以只需移动 len - k 步即可到达目标节点。

    • 例如,链表 1->2->3->4->5k=2(倒数第 2 个节点是 4):

      • len = 5len - k = 3

      • 从 head 移动 3 步:1(初始)→ 2 → 3 → 4,返回 4

时间复杂度
  • O(n),其中 n 是链表的长度。

    • 第一次遍历计算长度:O(n)

    • 第二次遍历定位节点:O(n)

    • 总时间:O(2n) = O(n)

空间复杂度
  • O(1),只使用了常数级别的额外空间(curr 指针和 len 变量)。

public static ListNode kthToLast(ListNode head, int k) {ListNode curr = head;int len = 0;// 第一次遍历:计算链表长度 lenwhile (curr != null) {len++;curr = curr.next;}// 第二次遍历:移动 len - k 步for (int i = 0; i < len - k; i++) {head = head.next;}return head;  // 返回倒数第 k 个节点
}

3、方法2:快慢指针

使用快慢指针(Fast-Slow Pointer)来找到链表的倒数第 k 个节点:

  1. 初始化快慢指针fast 和 slow 都指向头节点 head

  2. 快指针先移动 k-1 步

    • 目的是让 fast 和 slow 之间相隔 k-1 个节点。

    • 这样当 fast 到达链表末尾时,slow 正好指向倒数第 k 个节点。

  3. 同步移动快慢指针

    • 同时移动 fast 和 slow,每次各移动一步,直到 fast 到达最后一个节点(fast.next == null)。

  4. 返回慢指针

    • 此时 slow 指向的就是倒数第 k 个节点。

关键点
  1. 快指针先移动 k-1 步

    • 确保 fast 和 slow 之间的间隔是 k-1

    • 例如,k=2 时,fast 先移动 1 步,指向第 2 个节点,slow 仍在第 1 个节点,两者间隔 1(即 k-1)。

  2. 同步移动的条件

    • while (fast != null && fast.next != null)

      • fast != null:避免 fast 已经越界(理论上不会发生,因为题目保证 k 有效)。

      • fast.next != null:确保 fast 可以移动到下一个节点(即 fast 不是最后一个节点)。

    • 当 fast 是最后一个节点时(fast.next == null),循环停止,此时 slow 指向倒数第 k 个节点。

时间复杂度
  • O(n),其中 n 是链表的长度。

    • 快指针最多移动 n 步(先移动 k-1 步,再同步移动 n-k 步)。

    • 慢指针移动 n-k 步。

    • 总时间:O(n)

空间复杂度
  • O(1),只使用了两个指针(fast 和 slow),没有额外空间消耗。

public static ListNode kthToLast2(ListNode head, int k) {ListNode fast = head, slow = head;// 快指针先移动 k-1 步for (int i = 0; i < k - 1; i++) {fast = fast.next;}// 同步移动快慢指针,直到快指针到达最后一个节点while (fast != null && fast.next != null) {fast = fast.next;slow = slow.next;}return slow;  // 慢指针指向倒数第 k 个节点
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/904210.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/904210.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

R004 -计算机硬件基础

目录 1.数据表示&计算机网络组成 2.计算机网络分类 3.冯诺依曼体系结构 4.指令系统基础 5.指令系统类型 6.流水线技术 流水线周期 &#xff1a;各流水段中&#xff0c;执行时间最长的那一段。就是T 流水线时间&#xff1a;t 1t2t 3 (n-1) * T 7.流水线指标 8.存储系…

Mybatis学习(下)

目录 1. 动态sql的应用 1.2 1.2 1.3 、 、 标签 1.4 1. 动态sql的应用 使用Mybatis框架时, 对于sql数据的操作量比较大的时候, 看着会觉得很乱, 可能写着写着就乱了, 或者说回过头来发现sql语句写错了, 很麻烦, 所以动态sql就可以让我们用Java代码, 替换部分sql语句 1.2 &l…

iview 老版本合并单元格

新版的iview中已经支持了合并单元格了&#xff0c;我的版本比较老&#xff0c;为&#xff1a;"iview": "^3.5.2"。暂不支持。记录一下别的大佬的方法。感觉思路比较活&#xff0c;正在这种思路需要在解决问题的过程中学习。 核心思路&#xff1a;通过rende…

FGMRES(Flexible Generalized Minimal Residual)方法

FGMRES&#xff08;Flexible Generalized Minimal Residual&#xff09;方法是GMRES的变种&#xff0c;主要用于处理变预处理子&#xff08;即每次迭代的预处理子可能不同&#xff09;的情况。与标准GMRES相比&#xff0c;FGMRES通过存储预处理后的向量而非预处理子本身&#x…

自主采集高质量三维重建数据集指南:面向3DGS与NeRF的图像与视频拍摄技巧【2025最新版!!】

一、✨ 引言 随着三维重建技术的飞速发展&#xff0c;NeRF&#xff08;Neural Radiance Fields&#xff09;与 3D Gaussian Splatting&#xff08;3DGS&#xff09;等方法成为重建真实场景和物体几何细节的前沿方案。这些方法在大规模场景建模、机器人感知、文物数字化、工业检…

HarmonyOS Next-DevEco Studio(5.0.2)无网络环境配置(详细教程)

开发者如果电脑处于完全无网环境&#xff0c;可以参考下面文档进行相关配置 DevEco Studio(5.0.2)开发环境一览&#xff1a; 工具版本DevEco Studio5.0.2openHarmonySDK14ohpm5.0.11node.js18.20.1hypium1.0.21 一、下载DevEco Studio&#xff08;5.0.2 Release&#xff09;…

MIT XV6 - 1.1 Lab: Xv6 and Unix utilities - sleep 是怎样练成的?

接上文MIT XV6 - 1.1 Lab: Xv6 and Unix utilities - sleep 探究sleep.c是如何’炼成’的? 老实讲&#xff0c;我不熟悉Makefile&#xff0c;最多写过简单的编译和辅助脚本&#xff0c;拿到Xv6的Makefile是一脸懵的&#xff0c;至今还是一脸懵&#xff0c;那么我们上篇中新加的…

顺序结构双链表的实现

双链表是用最快的时间实现链表的一种方式&#xff0c;具体的实现代码如下&#xff1a; #pragma once #include<stdio.h> #include<stdlib.h> #include<assert.h>typedef int LTDataType; typedef struct ListNode {LTDataType data;struct ListNode* next;/…

GoFrame 奉孝学习笔记

第一章节 GoFrame 是一款基础设施建设比较完善的模块化框架 GoFrame 是一款基础设施建设比较完善的模块化框架, Web Server 模块是其中比较核心的模块,我们这里将 Web 服务开发作为框架入门的选择,便于大家更容易学习和理解。 用GOland编写代码 go.mod module goframePro…

pinia实现数据持久化插件pinia-plugin-persist-uni

在学习uniapp过程中&#xff0c;看到了pinia-plugin-persist-uni插件&#xff0c;以前面试过程中也有面试过说vuex数据刷新之前的数据就丢失了&#xff0c;之前回答的是把数据存储到数据库或者本地存储。pinia-plugin-persist-uni本质上数据也是本地存储。 1、安装 npm instal…

Git 多账号切换及全局用户名设置不生效问,GIT进行上传无权限问题

解决 Git 多账号切换及全局用户名设置不生效问题 在软件开发过程中&#xff0c;我们经常会使用 Git 进行版本控制。有时&#xff0c;我们需要在同一台机器上管理多个 Git 账号&#xff0c;最近我在进行使用git的时候因为项目要进行上传的不同的git账号&#xff0c;但是通过本地…

基于STM32定时器中断讲解(HAL库)

基于STM32定时器中断讲解&#xff08;HAL库&#xff09; 1、定时器简单介绍 以STM32F103C8T6中几个定时器为例&#xff1a; TIM1&#xff1a;这是一个高级定时器&#xff0c;不仅具备基本的定时中断功能&#xff0c;还拥有内外时钟源选择、输入捕获、输出比较、编码器接口以…

UE5 项目迁移 注意事项记录

做项目的时候项目越做越大 132g的体量一旦移动复制就耗时间 这个时候迁移派上了用场 前置知识&#xff1a;会使用基本ue迁移流程 以下是迁移注意事项 迁移步骤 首先把项目插件plugins复制粘贴到新项目中其次把.project文本形式 全部复制粘贴新项目中开始迁移项目 选中要迁移的…

套接字+Socket连接

制作加载中动画&#xff1a; 创建Panel&#xff0c;制作预制体&#xff0c;在Image游戏物体中添加DOTween插件&#xff0c;相关设置如下&#xff1a; (此为DOTween Pro,需付费&#xff0c;也可按下面的数值编写代码解决) Socket套接字 套接字就是将IP地址与主机端口号合并在一…

第 11 届蓝桥杯 C++ 青少组中 / 高级组省赛 2020 年真题答和案解析

一、选择题 第 1 题 单选题 题目:表达式 ‘6’ - ‘1’ 的值是 ( ) A. 整数 5 B. 字符 5 C. 表达式不合法 D. 字符 6 答案:A 解析:在 C++ 中,字符常量以 ASCII 码形式存储。6 的 ASCII 码为 54,1 的 ASCII 码为 49,二者相减结果为 5,是整数类型,因此选 A。 第 2 题 …

使用Rust + WebAssembly提升前端渲染性能:从原理到落地

一、问题背景&#xff1a;为什么选择WebAssembly&#xff1f; 最近在开发数据可视化大屏项目时&#xff0c;我们遇到了一个棘手的问题&#xff1a;前端需要实时渲染10万数据点的动态散点图&#xff0c;使用纯JavaScript Canvas方案在低端设备上帧率不足15FPS。经过性能分析&a…

【沐风老师】3DMAX按元素UV修改器插件教程

3DMAX按元素UV修改器UV By Element是一个脚本化的修改器插件。对于需要创建随机化纹理效果的用户而言&#xff0c;3DMAX的UV By Element修改器无疑是一款高效工具&#xff0c;它将以伪随机量偏移、旋转和/或缩放每个元素的UV坐标。 【版本要求】 3dMax 2016及以上 【安装方法】…

【神经网络与深度学习】改变随机种子可以提升模型性能?

引言 随机种子在机器学习和数据处理领域中至关重要&#xff0c;它决定了模型训练、数据划分以及参数初始化的随机性。虽然固定随机种子能确保实验的可重复性&#xff0c;但改变随机种子有时会意外提升模型性能。本文将探讨这一现象的潜在原因&#xff0c;并揭示随机性如何影响…

java技术总监简历模板

模板信息 简历范文名称&#xff1a;java技术总监简历模板&#xff0c;所属行业&#xff1a;其他 | 职位&#xff0c;模板编号&#xff1a;XDNUTA 专业的个人简历模板&#xff0c;逻辑清晰&#xff0c;排版简洁美观&#xff0c;让你的个人简历显得更专业&#xff0c;找到好工作…

OpenLayers:侦听缩放级别的变化

在实际开发中我们常常需要根据不同的缩放级别设置不同的展示效果或者执行不同的操作&#xff0c;因此侦听缩放级别的变化就很重要。想要侦听变化就需要依赖于OpenLayers中的事件系统&#xff0c;下面我将介绍两个相关的事件。 一、地图事件 moveend 1.介绍 在地图的移动结束…