用c语言编写算法O(n)的时间复杂度求链表的中间节点并由e值返回
时间: 2024-09-13 11:13:24 浏览: 49
C语言冒泡算法排序和链表中的应用
在C语言中,要实现一个时间复杂度为O(n)的算法来找到链表的中间节点,并返回中间节点的值(假设为e值),可以采用“快慢指针”策略。这种方法中,一个指针(慢指针)每次移动一个节点,而另一个指针(快指针)每次移动两个节点。当快指针到达链表末尾时,慢指针就会恰好位于链表的中间位置。这样就能在一次遍历内找到链表的中间节点。
以下是这个算法的示例代码:
```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) {
return NULL;
}
newNode->val = val;
newNode->next = NULL;
return newNode;
}
// 找到链表的中间节点并返回其中间节点的值
int findMiddleNode(ListNode *head) {
if (head == NULL) {
return -1; // 假设返回-1表示链表为空
}
ListNode *slow = head, *fast = head;
while (fast && fast->next) {
slow = slow->next;
fast = fast->next->next;
}
return slow->val; // 返回中间节点的值
}
int main() {
// 创建一个测试用的链表
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 middleValue = findMiddleNode(head);
printf("链表的中间节点值为: %d\n", middleValue);
// 清理链表内存
ListNode *temp;
while (head != NULL) {
temp = head;
head = head->next;
free(temp);
}
return 0;
}
```
在上述代码中,`findMiddleNode`函数就是使用快慢指针策略找到链表中间节点并返回其值的函数。需要注意的是,链表的头节点不计入中间节点的计算,即如果链表有偶数个节点,返回的是中间偏左的那个节点的值。
阅读全文