查找链表倒数第k结点完整C代码
时间: 2024-11-20 20:42:09 浏览: 14
查找链表倒数第K个节点是一个常见的链表操作问题。这里提供一个简单的C语言解决方案,使用两个指针法:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表结构体
typedef struct ListNode {
int val;
struct ListNode* next;
} ListNode;
// 创建新节点
ListNode* createNode(int val) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
if (!newNode) {
printf("Memory allocation failed.\n");
return NULL;
}
newNode->val = val;
newNode->next = NULL;
return newNode;
}
// 查找链表倒数第K个节点
ListNode* findKthToTail(ListNode* head, int k) {
if (head == NULL || k <= 0) {
return NULL;
}
ListNode* slow = head;
ListNode* fast = head;
for (int i = 0; i < k - 1; i++) {
if (fast != NULL && fast->next != NULL) {
fast = fast->next->next;
} else {
return NULL; // 如果快指针到达了链表尾部,说明链表长度小于k
}
}
while (fast != NULL) {
slow = slow->next;
fast = fast->next;
}
return slow;
}
// 打印链表
void printList(ListNode* head) {
ListNode* temp = head;
while (temp != NULL) {
printf("%d -> ", temp->val);
temp = temp->next;
}
printf("NULL\n");
}
int main() {
// 创建测试链表:1->2->3->4->5
ListNode* head = createNode(1);
head->next = createNode(2);
head->next->next = createNode(3);
head->next->next->next = createNode(4);
head->next->next->next->next = createNode(5);
int k = 2; // 我们要找的是倒数第二个节点
ListNode* result = findKthToTail(head, k);
if (result != NULL) {
printf("The node at position %d is %d\n", k, result->val);
} else {
printf("Invalid value of k or empty list.\n");
}
free(head); // 释放内存
return 0;
}
```
这个程序首先创建一个链表,然后调用`findKthToTail`函数找到指定位置的节点。如果链表长度小于k,它会返回NULL。运行此代码,你可以看到倒数第k个节点的值。
阅读全文