查找单链表倒数k节点c语言代码
时间: 2024-10-25 21:18:47 浏览: 56
查找单链表的倒数第K个节点通常需要两个指针同时移动,一个普通指针每次前进一步,另一个快指针每次前进两步。当快指针到达链表尾部时,普通指针就指向了倒数第二个节点。然后,普通指针再向前移动K-1次,即可得到倒数第K个节点。
以下是简单的C语言代码实现这一算法:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表结构体
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
ListNode* findKthToTail(ListNode* head, int k) {
if (head == NULL || k <= 0) {
return NULL;
}
// 快慢指针
ListNode* slow = head;
ListNode* fast = head;
// 当快指针到达链表尾部时,慢指针正好在倒数第二个位置
for (int i = 0; fast != NULL && fast->next != NULL; i++) {
fast = fast->next->next;
if (i == k - 1) {
break;
}
slow = slow->next;
}
// 如果找到了倒数第K个节点,返回它;否则返回NULL
if (fast != NULL) {
return slow;
} else {
return NULL;
}
}
void printList(ListNode* node) {
while (node != NULL) {
printf("%d -> ", node->val);
node = node->next;
}
printf("NULL\n");
}
int main() {
// 示例:输入链表 1 -> 2 -> 3 -> 4 -> 5 和 k=2
ListNode* head = (ListNode*)malloc(sizeof(ListNode));
head->val = 1;
head->next = (ListNode*)malloc(sizeof(ListNode));
head->next->val = 2;
head->next->next = (ListNode*)malloc(sizeof(ListNode));
head->next->next->val = 3;
head->next->next->next = (ListNode*)malloc(sizeof(ListNode));
head->next->next->next->val = 4;
head->next->next->next->next = (ListNode*)malloc(sizeof(ListNode));
head->next->next->next->next->val = 5;
head->next->next->next->next->next = NULL;
int k = 2;
ListNode* result = findKthToTail(head, k);
if (result != NULL) {
printf("The %dth to tail is: %d\n", k, result->val);
} else {
printf("Invalid k or empty list.\n");
}
printList(head); // 打印链表帮助理解
return 0;
}
```
这段代码首先定义了一个单链表结构,然后实现`findKthToTail`函数来找倒数第K个节点。在`main`函数中,我们创建了一个示例链表并测试了这个功能。
阅读全文