给定一个头结点为head的非空单链表,返回链表的中间结点。如果有两个中间节点,则返回第二个中间结点。 程序输入: 1 2 3 4 5 程序输出: 3编写C语言程序
时间: 2024-08-12 10:06:46 浏览: 50
50.两个链表的第一个公共节点1
要在C语言中编写一个程序来找到单链表的中间结点,我们可以使用快慢指针的方法。快指针每次移动两步,慢指针每次移动一步,当快指针到达链表末尾时,慢指针正好在链表的中间位置。如果链表有偶数个节点,慢指针会停在第二个中间结点。下面是C语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
struct ListNode {
int val;
struct ListNode *next;
};
// 创建新节点
struct ListNode* createNode(int val) {
struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
newNode->val = val;
newNode->next = NULL;
return newNode;
}
// 找到链表中间结点
struct ListNode* findMiddleNode(struct ListNode* head) {
if (head == NULL) return NULL;
// 快慢指针初始化
struct ListNode* slow = head;
struct ListNode* fast = head->next;
// 当fast指针到达末尾时,slow指针指向的就是中间结点
while (fast != NULL && fast->next != NULL) {
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
int main() {
// 假设输入的链表节点值已经预先定义并连接好
// 这里需要你提供实际的链表操作,例如从输入创建链表
struct ListNode* head = createListFromInput("1 2 3 4 5"); // 假设createListFromInput函数能根据输入生成链表
// 找到中间节点
struct ListNode* middleNode = findMiddleNode(head);
// 输出中间节点的值,这里需要添加代码输出节点值
printf("链表的中间结点值是: %d\n", middleNode->val);
// 释放内存
freeListNode(head); // 假设freeListNode是用于释放链表节点内存的函数
return 0;
}
```
阅读全文