C语言给定一个头结点为head的非空单链表,返回链表的中间结点。如果有两个中间节点,则返回第二个中间结点。 程序输入: 1 2 3 4 5 程序输出: 3
时间: 2024-08-12 22:07:10 浏览: 49
在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) {
if (head == NULL) {
printf("Error: The list is empty.\n");
return NULL;
}
ListNode* slow = head; // 慢指针
ListNode* fast = head; // 快指针
// 当快指针到达链表末尾时,慢指针会停在中间节点
while (fast != NULL && fast->next != NULL) {
fast = fast->next->next; // 快指针前进两步
slow = slow->next; // 慢指针前进一步
}
return slow;
}
int main() {
// 假设这里已经初始化了一个非空链表,例如:
// 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);
ListNode* middleNode = findMiddleNode(head);
if (middleNode != NULL) {
printf("The middle node value is: %d\n", middleNode->val); // 输出3
}
return 0;
}
```
阅读全文