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

目录捏

  • 一、题目描述
  • 二、示例与提示
  • 三、思路
  • 四、代码


一、题目描述

给定一个头节点为 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 个节点

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

后来发现使用双指针则可以不用统计链表长度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)

你可能感兴趣的:(力扣,leetcode,链表,算法)