求链表的第倒数第m个元素。以表尾插入法构造链表,然后在不改变链表的前提下,求链式存储的线性表的倒数第m个元素给出该题的c语言代码
时间: 2024-12-08 21:24:51 浏览: 10
在C语言中,我们可以创建一个单向链表结构,并使用迭代的方式来解决这个问题。首先,我们需要创建链表节点的结构体,然后定义一个函数来找到链表的倒数第m个元素。这里提供一个基本的示例:
```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));
if (!newNode) {
printf("Memory allocation failed.\n");
return NULL;
}
newNode->data = data;
newNode->next = NULL;
return newNode;
}
// 插入节点到链表尾部
void insertAtEnd(Node** head, int data) {
Node* newNode = createNode(data);
if (*head == NULL) {
*head = newNode;
return;
}
Node* temp = *head;
while (temp->next != NULL)
temp = temp->next;
temp->next = newNode;
}
// 求链表倒数第m个元素
int findKthFromTail(Node* head, int m) {
Node* slow = head;
Node* fast = head;
for (int i = 0; i < m - 1 && fast != NULL; i++) {
fast = fast->next;
}
if (fast == NULL) {
return -1; // 如果m大于链表长度,返回-1表示不存在
}
while (fast != NULL) {
slow = slow->next;
fast = fast->next;
}
return slow->data; // 返回倒数第m个元素
}
int main() {
Node* head = NULL;
int m = 3; // 假设我们要找的是倒数第三个元素
// 插入一些元素
insertAtEnd(&head, 1);
insertAtEnd(&head, 2);
insertAtEnd(&head, 3);
insertAtEnd(&head, 4);
insertAtEnd(&head, 5);
int result = findKthFromTail(head, m);
if (result != -1) {
printf("倒数第 %d 个元素是:%d\n", m, result);
} else {
printf("倒数第 %d 个元素不存在。\n", m);
}
return 0;
}
```
这个代码首先创建了一个链表,然后在主函数中调用`findKthFromTail`函数获取倒数第m个元素。如果链表长度小于m,函数会返回-1。
阅读全文