面试题15:链表中倒数第K个节点

面试题15:单链表中倒数第k个节点 题目 输入一个链表,输出该链表中倒数第k个节点。比如链表是1->2->3->4->5->5,输出倒数第三个节点就是4 思路 因为单链表中每个节点的指针指向是单向的,并且还不知道这个链表有多长,笨方法是先遍历一下链表,知道链表长度后再遍历一次找到倒数第k个节点。时间复杂度O(2n),感觉有点慢。 下面使用新的方法:设置两个指针,一个指针在头结点,另一个指针在头指针前面k-1个位置,然 阅读详情

题目:输入一个链表,输出该链表中倒数第K个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第一个节点。

链表的定义如下:

struct ListNode{
    int value;
    ListNode* next;
    ListNode(int data=int()):value(data),next(NULL)
    {}
};

分析

有三种方法:递归法,自定义栈法和前后指针法。

递归法

代码如下:

ListNode* _FindKthToTail(ListNode* head,int& k)
{
    if(head==NULL)
    {
        return  NULL;
    }
    else
    {
        ListNode* tmp=_FindKthToTail(head->next,k);
        if(k==0)
            return tmp;
    }
    if(k==1)
    {
        k=0;
        return head;
    }
    else if(k>1)
        k--;
}

ListNode* FindKthToTail(ListNode* head,int k)throw(ListIsTooShort)
{
    ListNode* tmp=_FindKthToTail(head,k);
    if(k==0)
        return tmp;
    else
        throw ListIsTooShort();
}

自定义栈法

ListNode* FindKthToTail(ListNode* head,int k)throw(ListIsTooShort)
{
    if(head==NULL || k<=0)
        return NULL;
    stack<ListNode*> s;
    while(head!=NULL)
    {
        s.push(head);
        head=head->next;
    }
    while(--k!=0 && !s.empty())
    {
        s.pop();
    }
    if(k==0)
        return s.top();
    else
        throw ListIsTooShort();
}

前后指针法

ListNode* FindKthToTail(ListNode* head,int k)throw(ListIsTooShort)
{
    if(head==NULL || k==0)
        return NULL;
    ListNode* front=head,*last=head;
    while(k-->0 && front!=NULL)
    {
        front=front->next;
    }
    if(k>0)
    {
        throw ListIsTooShort();
    }
    else
    {
        while(front!=NULL)
        {
            front=front->next;
            last=last->next;
        }
    }
    return last;
}

这三种方法的优缺点如下:

时间复杂度空间复杂度是否最优
递归法O(n)O(n)否
自定义栈法O(n)O(n)否
前后指针法O(n)O(1)是

因此,最好的方法是最后一种。

以上

如果你有任何想法或是可以改进的地方,欢迎和我交流!

完整代码及测试用例在github上:点我前往

22. 链表中倒数第 k 个节点 输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。步,然后快慢指针同时向前走,直到快指针走到链表尾部,此时慢指针指向的节点就是倒数第。个节点,从头节点开始,它们的值依次是。我们可以定义快慢指针。 阅读详情

相关推荐

视觉SLAM十四讲习题答案

阅读《视觉SLAM十四讲》中遇到的问题及习题资源整理,或为原创,或来自网络,如有问题请与我联系,会在第一时间加以修正。 后来自己写完看到另一位写的博客,相形见绌,大家可以互相结合的看。 第一讲 1.线性方程的解:转载自宋洋鹏(youngpan1101),了解线性代数可关注B站3Blue1Brown,以及线性代数,知乎上有其精细笔记。 2.高斯分布参考这位博主Johnny-Cuii的文章,具体...

INFINITE POSSIBILITIES 1万+

数据结构-输出单链表倒数第K个结点值

【问题描述】输入一个单向链表,输出该链表中倒数第k个结点,链表的最后一个结点是倒数第1个节点。【输入形式】输入第一位为K值,其后接一串以空格分隔的整型值,输入-1时停止建立链表。【样例说明】K值为3,则输出链表倒数第3个结点的值,为4;数据输入间以空格隔开。【输出形式】输出为倒数第K个结点的值,若无,则输出Not Found。【样例输入】3 13 45 54 32 1 4 98 2 -1。

m0_63581095的博客 2918

使用Kolla部署多节点Rocky版本OpenStack

openstack命令行客户端使用,post-deploy会在 /etc/kolla/目录下生成文件admin-openrc.sh。每次使用openstack命令时执行source /etc/kolla/admin-openrc.sh(manager节点执行)source /etc/kolla/admin-openrc.sh (将文件内容复制到/etc/profile中,即可一直生效)3.2.2 开始安装kolla-ansible,要带上--ignore-installed PyYAML,否则可能会报错。

gyc1206的博客 1926

【剑指offer】链表中倒数第k个节点,C++实现(链表)

1.题目 输入一个链表,输出该链表中倒数第k个结点。链表的尾节点是倒数第一个节点。 struct ListNode { int val; struct ListNode *next; } 2.思路 两个指针遍历链表:第一个指针从链表的头节点走k-1步,第二个指针不动;从第k步开始,第二个指针也开始从链表的头节点开始遍历...

weixin_34268753的博客 358

ESD 防护深度解析:模型、等级、系统设计与防护策略

本文系统阐述了静电放电(ESD)防护的核心技术体系。首先对比分析了HBM(人体模型)和CDM(充电设备模型)两种基础ESD模型的物理特性、测试标准及分级要求,指出相同电压下CDM的破坏性是HBM的15-20倍。其次详细解析了IEC61000-4-2系统级ESD标准,包括接触/空气放电测试方法及判定等级。重点提出了系统级防护的三层架构:空间隔离(≥10mm间距)、电气隔离(地平面分割)和TVS管选型(响应时间<1ns),并对比了MOV、SCR等防护器件特性。针对不同应用场景(消费电子、工业控制等)给出了差异化

bother3000的博客 1882

具身智能:从理论突破到场景落地的全解析

具身智能(Embodied Intelligence)是人工智能与机器人学深度融合的前沿领域,其核心在于通过物理实体与环境的动态交互实现智能行为。区别于传统 AI 的 “离身性”(如语音助手仅依赖数据输入),具身智能强调 “智能体通过身体感知世界并反作用于环境”,形成 “感知 - 决策 - 行动” 的闭环。例如,能自主避障的配送机器人、可精准抓取异形物体的机械臂,均通过传感器网络与环境实时互动,在试错中优化行为策略。

LeeKumaの技术Note 2681

【图文解析】链表中倒数第 k 个结点

目录例题描述解题思路代码实现小结 例题描述 输入一个链表,输出该链表中倒数第k个结点。 示例: 输入:1->2->4->1->3->4,k = 3 输出:此列表中的结点 1 (序列化形式:[1,3,4]) 结点结构体定义 struct ListNode { int val; struct ListNode *next; }; 解题思路 前后指针法: 建...

giturtle's blog 2564

避坑指南:STM32移植CanFestival时那些没人告诉你的细节(含TJA1050硬件适配)

本文深入解析STM32移植CanFestival协议栈时的关键细节与TJA1050硬件适配技巧,涵盖AVR残留代码清理、定时器中断优化及CAN通信稳定性提升方案。特别针对TJA1050在特定波特率下的信号畸变问题提供实战解决方案,帮助开发者规避移植过程中的隐形陷阱,实现工业级稳定通信。

work3的博客 761

算法:链表中倒数第k个节点

学习算法,不仅能让自己思维能力更是一个台阶,也能在大数据和人工智能时代为自己打下坚实的基础,成为互联网行业的高端人才,而不是一直停留在低水平的体力编程层次。

孤芳不自赏 2778

[23]-->变长SPI接口

然而,FPGA技术复杂,学习门槛较高,许多人(初学者或学生)在学习过程中面临诸多挑战。(1)模式0:SCK串行时钟线空闲是为低电平,数据在SCK时钟的上升沿被采样,数据在SCK时钟的下降沿切换,CPOL= 0,CPHA=0;(2)模式1:SCK串行时钟线空闲是为低电平,数据在SCK时钟的下降沿被采样,数据在SCK时钟的上升沿切换,CPOL= 0,CPHA=1;(3)模式3:SCK串行时钟线空闲是为高电平,数据在SCK时钟的上升沿被采样,数据在SCK时钟的下降沿切换,CPOL= 1,CPHA=1;

m0_46498597的博客 178

使用Simulink进行四足机器人的非线性动力学建模与仿真

四足机器人的运动包含多个自由度(DOF),包括腿部的摆动和支撑阶段的动力学特性。由于存在接触力、摩擦以及不同地形的影响,四足机器人的动力学行为呈现出高度的非线性特征。因此,构建准确的非线性动力学模型对于研究机器人的运动学和动力学特性至关重要。定义代表机器人状态的变量,如位置、速度、角度和角速度。matlab深色版本通过本指南,我们介绍了如何基于Simulink搭建一个四足机器人的非线性动力学模型,并进行了详细分析。

xiaoheshang_123的博客 311

LeetCode——剑指 Offer 22. 链表中倒数第k个节点

一、题目 输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。 例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。 示例: 给定一个链表: 1->2->3->4->5, 和 k = 2. 返回链表 4->5. 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/lian-biao-z

FuckerGod的博客 863

几种常见的Web攻击

几种常见的Web攻击 文章目录几种常见的Web攻击一、DoS攻击1.SYN洪水攻击2.IP欺骗3.Land攻击4.针对DoS攻击的防御二、CSRF攻击1. CSRF攻击的发生有三个必要条件:2.几种防护方法:三、XSS漏洞攻击1.非持久型XSS漏洞2.持久型XSS漏洞四、SQL注入1.SQL注入的危害2.SQL注入的方式3.防止SQL注入的解决方案 一、DoS攻击 DoS(Denial of Service),拒绝服务,顾名思义这种攻击是为了让服务器无法提供正常服务,最常见的DoS攻击是网络带宽攻击和连

wolfGuiDao的博客 1259

面试题15:链表中倒数第k个节点

题目:输入一个链表,输出该链表中倒数第k个节点。从1开始计数,如链表有1,2,3,4,5,6.倒数第三个节点是值为4的节点。     可以采用两个指针,思路比较清晰,但是就是一些边界条件很难考虑全,比如k超出了链表的长度。    struct ListNode { int val; struct ListNode *next; ListNode(int x) :val(x), next(

小胡——uYou的专栏 316

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

{面试题15: 链表中倒数第 k 个节点}

From 剑指Offer 何海涛 著 #include <iostream> struct ListNode { int m_nValue; ListNode *m_pNext; }; ListNode* findKthToTail(ListNode *head, unsigned int k) { ListNode *first = ...

weixin_30314631的博客 67

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

《剑指offer》面试题15:链表中倒数第k个节点

题目:输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如一个链表有6个节点,从头节点开始它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。特殊情况:空链表。倒数第0个节点。k大于链表长度。public static ListNode findKthToTail(ListNode head, int k...

twostarxx的博客 201

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

剑指Offer---面试题15:链表中的倒数第k个节点

一.题目 输入一个链表,输出该链表中倒数第k个结点。/* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ public class Solution { public ListNode FindKth

范二er 529

面试题15:链表中倒数第k个节点(Leetcode-19:Remove Nth Node From End of List)

设置两个指针p,q;p,q相差n-1步。 p,q同时前进,当q.next == null时,此时p所指向的节点就是要被删除的节点。遍历的过程中用pre记录p的前驱。 找到要被的删除的节点p后要讨论: 1.如果p是头节点,则直接返回p.next 2.如果p是尾节点,则pre.next = null 3.否则,pre.next = pre.next.next public ListNode

罗布泊coding 721

单链表【数据结构】

/数据域//指针域}Node;

Wwy_vicky的博客 45

面试题15:查找链表中倒数第k个结点

仅一次遍历查找链表中倒数第k个结点。

wakaka的博客 2779

剑指offer  15.链表中倒数第k个节点

剑指offer 15.链表中倒数第k个节点 题目:https://www.nowcoder.com/practice/529d3ae5a407492994ad2a246518148a?tpId=13&tqId=11167&tPage=1&rp=1&ru=%2Fta%2Fcoding-interviews&qru=%2Fta%2Fcoding-interv...

快乐划水程序猿的专栏 191

剑指offer 面试题15—链表中倒数第k个节点

基本思想: 解法一:O(n^2) 先算出链表的长度n,然后倒数第k个结点就是顺序的第(n-k+1)个数,不过这样需要2次遍历链表,第一次统计出链表中节点的个数n,第二次就能找到倒数第k个节点。 解法二:O(n) 只需一次遍历。设定两个指针p1和p2,两个指针刚开始都指向链表的第一个结点,然后让p1指针先走(k-1)步,然后再让两个指针一起往后走,当p1指针指向链表最后一个结点的时候

小地盘的诺克萨斯 1151

面试题15:链表中倒数第k个结点

//面试题15:链表中倒数第k个结点 //题目:输入一个链表,输出该链表中倒数第K个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是 //倒数第1个结点。例如一个链表有6个结点,从头结点开始它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个结//点是值为4的结点。//要求只遍历链表一次,所以需要使用两个指针 //问题:考虑各种出现的特殊情况,如:头指针为空,...

86
上一篇: 面试题14:调整数组顺序使奇数位于偶数前面
下一篇: 面试题16:反转链表
SmartBrave
博客等级 码龄12年 25粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值