C 程序:单链表查找倒数第 k 个节点

题目03

✅ 题目简化

● 链表带头节点,头指针为 head。

● 输入一个正整数 k,查找链表中倒数第 k 个节点。

● 若找到,输出该节点 data 值,返回 1;否则返回 0。

✅ 算法设计思想(双指针法)

使用两个指针 fast 和 slow:

1. 先让 fast 指针先走 k 步。

2. 然后两个指针一起走,直到 fast 指针走到尾部(即为 NULL)。

3. 此时 slow 所在位置即为倒数第 k 个节点。

这样只遍历一次链表,时间复杂度是 O(n),空间复杂度是 O(1),非常高效。

✅ 详细步骤

  1. 检查 head 是否为空(注意有头结点,实际数据从 head->next 开始)。

  2. 定义两个指针 fast 和 slow,都初始化为 head->next。

  3. fast 指针先走 k 步。如果还没走够 k 步就到 NULL,说明链表长度不足 k,直接返回 0。

  4. 然后 fast 和 slow 一起向后走,直到 fast 到达尾部。

  5. 此时 slow 就是倒数第 k 个节点,输出 data 并返回 1。

#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    int data;
    struct Node* next;
} Node;

int FindKthToLast(Node* head, int k, int* out) {
    if (!head || k <= 0) return 0;

    Node* fast = head->next; // 第一个实际结点
    Node* slow = head->next;

    // fast 先走 k 步
    for (int i = 0; i < k; ++i) {
        if (!fast) return 0; // k 超过了链表长度
        fast = fast->next;
    }

    // fast 和 slow 一起走
    while (fast) {
        fast = fast->next;
        slow = slow->next;
    }

    *out = slow->data;
    return 1;
}

如图中链表是 6 个实际节点(不含头结点),若输入 k=3,算法会返回编号为 ④ 的节点(紫色),正是倒数第 3 个节点,符合题意。

posted @ 2025-07-18 09:33  Aino_D  阅读(21)  评论(0)    收藏  举报