LeetCode-剑指 Offer 22. 链表中倒数第k个节点(C语言 )

文章讲述了在给定链表中找到倒数第cnt个训练项目编号的问题,提出了一种使用快慢指针的方法,通过快指针先走cnt步,然后两者同步移动,最终慢指针指向目标节点,时间复杂度为O(n)。


一、题目描述

给定一个头节点为 head 的链表用于记录一系列核心肌群训练项目编号,请查找并返回倒数第 cnt 个训练项目编号。

二、示例与提示

示例 1:

输入: head = [2,4,7,8], cnt = 1
输出: 8

提示

  1. 1 <= head.length <= 100
  2. 0 <= head[i] <= 100
  3. 1 <= cnt <= head.length

三、思路

本题第一时间想到的解法:

  1. 遍历统计链表长度,记为 n
  2. 设置一个指针(n−cnt) 步,即可找到链表倒数第 cnt 个节点

在这里插入图片描述

后来发现使用双指针则可以不用统计链表长度kcnt):

  1. 设置快慢指针皆指向链表头结点
  2. 快指针先走 cnt
  3. 快慢指针共同移动,直至快指针走过链表尾节点时跳出(跳出后,慢指针即指向倒数第 cnt 个节点)
  4. 返回慢指针即可

四、代码

struct ListNode* trainingPlan(struct ListNode* head, int cnt) {
    struct ListNode* fast = head, *slow = head;
    // 快指针先走cnt步
    while (cnt--)
    fast = fast->next;
    // 快慢指针共同移动,直至快指针走过链表尾节点
    while (fast) {
        fast = fast->next;
        slow = slow->next; // 此时慢指针指向倒数第cnt个节点
    }
    // 返回慢指针即可
    return slow;
}

复杂度分析

时间复杂度: O(n)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值