用C语言写代码:输入 L是给定的带头结点的单链表 输出 函数Find要将L的倒数第m个元素返回,并不改变原链表。如果这样的元素不存在,则返回一个错误标志ERROR 样例输入 5 1 2 4 5 6 3 样例输出 4 1 2 4 5 6
时间: 2024-10-21 09:08:11 浏览: 21
在C语言中,你可以通过遍历链表并跟踪当前节点的位置来实现这个功能。这里是一个简单的示例,假设链表节点结构为`typedef struct Node {int data; struct Node* next;}`:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构
typedef struct Node {
int data;
struct Node* next;
} Node;
// 创建新节点
Node* createNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->next = NULL;
return newNode;
}
// 插入节点到链表末尾
void appendToList(Node** head, int data) {
if (*head == NULL) {
*head = createNode(data);
return;
}
Node* current = *head;
while (current->next != NULL) {
current = current->next;
}
current->next = createNode(data);
}
// 找到倒数第m个节点并返回
int findMthFromEnd(Node* head, int m) {
if (head == NULL || m <= 0) {
return -1; // 错误标志,表示找不到或m值无效
}
Node* slow = head; // 指向当前节点
Node* fast = head; // 每次移动两步,用于找到链表长度
for (int i = 0; fast && fast->next; i++) {
fast = fast->next->next;
}
if (!fast) {
return -1; // 链表太短,无法找到倒数第m个节点
}
// 移动slow指针回到倒数第m个位置
for (int i = 0; i < m - 1; i++) {
slow = slow->next;
}
return slow->data;
}
// 示例输入处理
int main() {
Node* listHead = NULL;
int n, m;
printf("请输入链表长度和查找位置(以空格分隔): ");
scanf("%d %d", &n, &m);
// 填充链表
for (int i = 1; i <= n; i++) {
appendToList(&listHead, i);
}
int result = findMthFromEnd(listHead, m);
if (result != -1) {
printf("倒数第%d个元素是:%d\n", m, result);
} else {
printf("错误标志ERROR\n");
}
return 0;
}
```
在这个示例中,我们首先创建一个链表,然后使用双指针法找到倒数第m个节点。如果找到了,就返回该节点的数据;如果没有找到或者链表长度小于m,函数返回错误标志-1。
阅读全文