【问题描述】输入一个单向链表,输出该链表中倒数第k个结点,链表的最后一个结点是倒数第1个节点。 【输入形式】输入第一位为K值,其后接一串以空格分隔的整型值。 【输出形式】输出为倒数第K个结点的值,若无,则输出Not Found 【样例输入】3 13 45 54 32 1 4 98 2 【样例输出】4 【样例说明】K值为3,则输出链表倒数第3个结点的值,为4;数据输入间以空格隔开 【评分标准】本题要综合输出正确性及使用的数据结构。需由输入数据构建单链表。不使用链表的将不得分c语言实现
时间: 2025-03-30 08:06:39 浏览: 30
为了实现这个问题,我们首先需要了解如何构建单向链表以及如何通过遍历找到倒数第 k 个节点。以下是详细的解决步骤:
### 解决思路:
1. **建立链表**:我们需要先根据输入的数据创建一个单向链表。
2. **双指针法**:使用两个指针 `p` 和 `q` 遍历链表。开始时让 `q` 先走 k 步,然后同时移动 `p` 和 `q` 直到 `q` 到达链表尾部。此时 `p` 所指向的位置就是我们要找的倒数第 k 个节点。
这种方法的时间复杂度为 O(n),其中 n 是链表长度,并且只需要一次遍历即可完成任务。
### 实现代码 (C语言):
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
// 创建新节点函数
Node* create_node(int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = value;
newNode->next = NULL;
return newNode;
}
// 插入节点至链表尾部
void append_node(Node** head_ref, int new_data) {
Node* newNode = create_node(new_data);
if (*head_ref == NULL) {
*head_ref = newNode;
return;
}
Node* temp = *head_ref;
while(temp->next != NULL){
temp = temp->next;
}
temp->next = newNode;
}
int find_kth_from_end(Node* head, int k) {
Node* p = head;
Node* q = head;
for(int i=0;i<k;i++) { // 让q向前走k步
if(q==NULL)
return -1; // 如果q走到头了还没走完k步,则返回错误标志
q=q->next;
}
while(q!=NULL){ // 同时前进直到q到达末尾
p=p->next;
q=q->next;
}
return p ? p->data : -1; // 返回结果
}
int main() {
int K, val;
scanf("%d", &K); // 输入K值
Node* head = NULL;
while(scanf("%d",&val)!=EOF && getchar()!= '\n'){ // 构建链表
append_node(&head,val);
}
int result = find_kth_from_end(head,K);
if(result==-1 || !head){
printf("Not Found\n");
}else{
printf("%d\n",result);
}
return 0;
}
```
这个程序实现了从用户那里接收一系列数字作为输入并构造出相应的单向链表,最后计算并打印出指定位置的结果。
阅读全文
相关推荐


















