《程序员面试金典(第6版)》面试题 02.02. 返回倒数第 k 个节点(双指针法,链表)

news2024/11/24 10:52:51

题目描述

实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。
题目传输门:添加链接描述

示例:

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

说明:

  • 给定的 k 保证是有效的。

解题思路与代码

  • 这道题是一道简单题,考验到了在链表中查找一个指定节点的值的这种普通链表操作。

  • 这道题你可以不使用任何技巧也能够做出来,不过更优秀一点的做法就是使用双指针来解决这道题。

方案一: 先遍历链表长度法 (普通做法)

  • 倒数第k个节点,就是正数第n - k个节点。我们先遍历出节点的个数,然后再减去k,之后再遍历n - k 个节点 ,就能找到第k个节点的值

具体的代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    //首先while循环,变量出节点的个数,然后再次遍历列表。求值
    int kthToLast(ListNode* head, int k) {
        int count = 0;
        ListNode* pos = head;
        while(pos != nullptr){
            count++;
            pos = pos->next;
        }
        pos = head;
        count  -=  k ;
        while(count > 0){
            pos = pos->next;
            count--;
        }
        return pos->val;  
    }
};

在这里插入图片描述

复杂度分析

时间复杂度:

  • O(n),因为只是普通的遍历链表

空间复杂度:

  • O(1),因为没有用到任何的额外的数据结构

双指针法

  • 这种做法比上一种做法更加巧妙。我们先创建两个指针,分别都指向头节点,其中一个指针先走k步,然后再再两个指针一起走。

  • 当其中一个指针走到尽头时,另一个指针指向的就是我们所需要的那个节点啦,你仔细想想或者画一下图就能够明白其中的道理。

具体的代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    int kthToLast(ListNode* head, int k) {
        ListNode* cur = head;
        ListNode* pre = head;
        for(int i = 1; i < k; i++)
            cur = cur->next;
        while(cur->next != nullptr){
            cur = cur->next;
            pre = pre->next;
        }
        return pre->val;
    }
};

在这里插入图片描述

复杂度分析

时间复杂度:

  • O(n),虽然表面上这种解法的大O表示法表现出来的时间复杂度与方案一一致,但是还是进行了优化,我们还是少遍历几个节点的。

空间复杂度:

  • O(1),因为没有使用额外的数据结构

总结

这道题的主要目的是考察你对链表数据结构的理解以及编程技巧。

  • 链表是一种基本的数据结构,在很多编程语言和计算机科学问题中都会出现。熟悉并理解链表是很重要的基础知识。

具体来说,这个问题考察了以下几个方面:

  • 链表的理解:你需要了解链表的结构,如何遍历链表,以及如何确定链表的长度。

  • 编程技巧:这个问题特别关注你是否可以找到一个高效的解决方案。最直接的方法可能是先遍历整个链表以确定其长度,然后再次遍历来找到倒数第 k 个节点。但是这需要两次遍历。一个更优的解决方案是使用双指针技术,只需要一次遍历即可找到倒数第 k 个节点。

  • 边界条件处理:这个问题还需要你处理一些边界条件,比如当链表为空或者 k 大于链表长度时,你的代码应该如何处理。

所以,这个问题的意义主要在于考察你对链表的理解,你的编程技巧,以及你对边界条件的处理能力。

最后的最后,如果你觉得我的这篇文章写的不错的话,请给我一个赞与收藏,关注我,我会继续给大家带来更多更优质的干货内容

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

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

相关文章

Axure教程-横向动态堆叠图(中继器)

本文将教大家如何用AXURE中的中继器动态横向堆叠图 一、效果介绍 如图&#xff1a; 预览地址&#xff1a;https://3ajwd3.axshare.com 下载地址&#xff1a;https://download.csdn.net/download/weixin_43516258/87810612 二、功能介绍 简单填写中继器内容即可生成动态竖向堆…

移动应用测试不可少的技能,使用Appium和Python实现Activity切换

目录 前言&#xff1a; 一、Appium简介 二、切换Activity操作 三、使用 Appium 实现切换 Activity 操作的注意事项 四、结论 前言&#xff1a; App测试自动化是当前移动应用开发测试领域中的热点之一。在应用开发的过程中&#xff0c;切换Activity是一个常见的操作&#x…

网易易盾流量多发反外挂落地实践

背景及目的 环境迁移 反外挂服务建德机房线上迁移&#xff0c;采取的方案是&#xff1a;建德机房独立部署一套完整的集群&#xff0c;统一经由完整的性能测试、故障演练、功能回归后&#xff0c;通过线上分阶段切换流量的方式来切服务。QA 需要比对验证 2 个不同环境下核心接口…

PostgreSQL技术内幕(八)源码分析 ——投影算子和表达式计算

在上期Postgres技术内幕系列直播中&#xff0c;我们为大家介绍了Postgres投影算子和表达式计算实现原理和底层细节。本文根据直播内容整理&#xff0c;作者现任HashData内核研发工程师。 投影 (projection) 关系代数中的一种&#xff0c; 用于从关系R中选出属性包含在A中的列…

简单易懂,一篇文章告诉你什么是云渲染!

随着5G、AI、云计算、云服务等资讯来袭&#xff0c;我们发现云渲染被更多人知晓和关注&#xff0c;通过搜集和调研云渲染业内的相关信息和模式&#xff0c;尽量用简明的方式为大家解答到底 什么是云渲染。 用户将本地任务提交到远程服务器&#xff0c;通过远程的计算机集群资源…

C++ 类和对象(静态的static、友元、内部类、匿名对象、explicit)知识点+完整思维导图+实操图+深入细节通俗易懂建议收藏

绪论 时间的步伐有三种&#xff1a;未来姗姗来迟&#xff0c;现在像箭一样飞逝&#xff0c;过往永远静立不动。本章是类和对象的一个收尾篇&#xff0c;相信通过这三篇类和对象的学习&#xff0c;应该你已经更加清楚了解了C的类和对象。 话不多说安全带系好&#xff0c;发车啦&…

耗时162天,从华为外包5k转岗正式员工15k,经历的心酸只有自己知道····

一提及外包测试&#xff0c;大部分人的第一印象就是&#xff1a;工作强度大&#xff0c;技术含量低&#xff0c;没有归属感&#xff01; 本人毕业于某普通二本院校非计算机专业&#xff0c;跨专业入行测试&#xff0c;至今有近 5年工作经验。 第一份测试工作是在华为做了两年外…

【LCM】LCM通讯入门

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍LCM的通讯。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习知识&#xff0c;共同进步。 &#x1f95e;喜欢的朋友可以关注一下&#xff0c;下次更新…

Linux-初学者系列6_kvm虚拟机

速通配置kvm虚拟机 通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。 在一台计算机上同时运行多个逻辑计算机&#xff0c;每个逻辑计算机可以运行不同的操作系统&#xff0c;并且应用程序都可以在相互独立的空间内运行互不影响&#xff0c;提高计算机的工作效率。 一、 配置…

真题详解(include)-软件设计(八十二)

真题详解&#xff08;快速排序&#xff09;-软件设计&#xff08;八十一)https://blog.csdn.net/ke1ying/article/details/130806047 generalliza&#xff08;泛化&#xff09;&#xff1a;泛化是一种继承关系&#xff0c;子类将继承基类所有行为&#xff0c;关系和通信&#…

章节2:Burp Suite配置启动

章节2&#xff1a;Burp Suite配置启动 01 Burp Suite程序下载 程序下载 Burp Suite jar包JDK&#xff0c;JDK包含JRE&#xff08;Java运行时环境&#xff09;激活jar包汉化jar包 Burp jar包 推荐2021&#xff0c;jar包版本 https://portswigger.net/burp/releases JRE环…

带你手撕链式二叉树—【C语言】

前言&#xff1a; 普通二叉树的增删查改没有意义&#xff1f;那我们为什么要先学习普通二叉树呢&#xff1f; 给出以下两点理由&#xff1a; 1.为后面学习更加复杂的二叉树打基础。&#xff08;搜索二叉树、ALV树、红黑树、B树系列—多叉平衡搜索树&#xff09; 2.有很多二叉树…

【C++进阶之路】模板

前言 假如需要你写一个交换函数&#xff0c;交换两个相同类型的值&#xff0c;这时如果交换的是int 类型的值&#xff0c;你可能会写一个Swap函数&#xff0c;其中参数是两个int类型的&#xff0c;假如再让你写一个double类型的呢&#xff1f;你可能又要写一个Swap的函数重载&…

运营-14.优惠券规则

优惠券使用场景 1. 需要先领取&#xff1b; 2. 在购买商品的时候可以抵用部分费用&#xff1b; 3. 在有效期内可以随时使用&#xff1b; &#xff08;根据场景和类型会有区别&#xff09; 优惠券的优势 1. 可以控制数量&#xff0c;确保活动成本可控&#xff1b; 2. 使用灵活&a…

「超强」ChatGPT撰写的艾思科技软件定制开发行业可行性报告分析

I. 引言 - 报告目的和范围 本报告的目的是分析山东艾思软件科技有限公司在定制软件开发行业的可行性&#xff0c;并提供相关建议和指导。本报告主要分析定制软件开发行业的市场概况、市场规模和增长潜力、市场需求、供应情况以及市场财务可行性。本报告旨在为山东艾思软件科技…

BIM建模|什么样的计算机可以支撑BIM应用?

BIM建模&#xff5c;什么样的计算机可以支撑BIM应用&#xff1f; 随着国内BIM技术的不断发展&#xff0c;越来越多企业和个人开始重视BIM&#xff0c;而作为BIM应用的数据生产载体&#xff0c;计算机硬件实力显得尤为重要。 现阶段BIM软件种类繁多&#xff0c;不同项目、不同…

Mysql安装与卸载(Windows版本)

Mysql的安装 这里使用的Mysql版本是8.0.26 界面操作描述信息 1. 接受条款&#xff0c;下一步&#xff0c;准备开始安装image-202111220927156542. 选择Custom&#xff0c;自定义安装&#xff0c;Nextimage-202111221638172083. 以自己的操作系统为准&#xff0c;不过大多数都…

批发零售商城小程序开发功能优势有哪些?

阿里发展到今天可能是很多人都意想不到的&#xff0c;谁能行到当初马云的一个大胆决定会让其成为批发零售行业的龙头呢。随着互联网技术的深入发展&#xff0c;现在越来越的商家企业也都寻求新的经营发展方式&#xff0c;批发零售商城小程序开发作为一种新型的电商模式&#xf…

达梦数据库安装教程

目录 安装教程 安装前准备 新建dmdba用户 修改文件打开最大数 挂载镜像 新建安装目录 数据库安装 配置环境变量 配置实例 注册服务 启动停止服务 启动 查看端口 停止 数据库目录结构介绍 数据库安装目录 达梦数据库 DM8下载地址产品下载 | 达梦数据库 (dameng.…

【Vue基础】Vue路由,实现页面跳转

一、需求说明 点击不同的模块实现页面跳转&#xff0c;如下点击“员工管理”右侧会显示员工管理页面&#xff0c;如下图1&#xff1b;点击“入住信息”右侧会显示入住信息&#xff0c;如下图二 二、涉及文件 1、 主要上图在这几个文件中修改相关代码 2、知识点整理 1&#x…