编写一个C语言代码:给定一个头结点为head的非空单链表,返回链表的中间结点。如果有两个中间节点,则返回第二个中间结点。 程序输入: 1 2 3 4 5 程序输出: 3
时间: 2024-08-12 22:07:06 浏览: 56
为了编写一个C语言代码来解决这个问题,我们可以使用迭代方法,通过两个指针,一个快指针和一个慢指针。快指针每次移动两步,慢指针每次移动一步,这样当链表长度为奇数时,快指针会在终点前一步到达,即慢指针就是中点;如果链表长度为偶数,两个指针会在中点相遇。下面是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));
newNode->val = val;
newNode->next = NULL;
return newNode;
}
// 找到链表的中间节点
ListNode* findMiddleNode(ListNode* head) {
ListNode* slow = head;
ListNode* fast = head;
// 使用快慢指针
while (fast && fast->next) {
fast = fast->next->next; // 快指针前进两步
slow = slow->next; // 慢指针前进一步
}
return slow;
}
int main() {
// 输入链表元素,假设这里是一个静态示例,实际应用中应从其他地方读取
int arr[] = {1, 2, 3, 4, 5};
int length = sizeof(arr) / sizeof(arr);
// 创建链表
ListNode* head = createNode(arr);
ListNode* current = head;
for (int i = 1; i < length; i++) {
current->next = createNode(arr[i]);
current = current->next;
}
// 找到并打印中间节点
ListNode* middleNode = findMiddleNode(head);
printf("The middle node is: %d\n", middleNode->val);
return 0;
}
```
阅读全文