C 程序:单链表查找倒数第 k 个节点
题目
✅ 题目简化
● 链表带头节点,头指针为 head。
● 输入一个正整数 k,查找链表中倒数第 k 个节点。
● 若找到,输出该节点 data 值,返回 1;否则返回 0。
✅ 算法设计思想(双指针法)
使用两个指针 fast 和 slow:
1. 先让 fast 指针先走 k 步。
2. 然后两个指针一起走,直到 fast 指针走到尾部(即为 NULL)。
3. 此时 slow 所在位置即为倒数第 k 个节点。
这样只遍历一次链表,时间复杂度是 O(n),空间复杂度是 O(1),非常高效。
✅ 详细步骤
-
检查 head 是否为空(注意有头结点,实际数据从 head->next 开始)。
-
定义两个指针 fast 和 slow,都初始化为 head->next。
-
fast 指针先走 k 步。如果还没走够 k 步就到 NULL,说明链表长度不足 k,直接返回 0。
-
然后 fast 和 slow 一起向后走,直到 fast 到达尾部。
-
此时 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 个节点,符合题意。

浙公网安备 33010602011771号