给定一个带头结点为head的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第一个中间结点。c语言。函数
时间: 2024-10-24 22:18:35 浏览: 27
Java数据结构与算法-单链表 新浪,腾讯面试题详解
在C语言中,你可以通过双指针法来找到链表的中间节点。这里是一个简单的示例函数,它假设链表节点有一个`data`成员用于存储数据,以及一个`next`指针指向下一个节点:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct ListNode {
int data;
struct ListNode* next;
} ListNode;
// 函数声明
ListNode* findMiddleNode(ListNode* head);
// 创建一个新的链表节点
ListNode* createNode(int value) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->data = value;
newNode->next = NULL;
return newNode;
}
// 找到链表的中间节点
ListNode* findMiddleNode(ListNode* head) {
if (head == NULL || head->next == NULL) {
// 如果链表为空或只有一个节点,直接返回头节点作为中间节点
return head;
}
ListNode* slow = head; // 慢指针,每次移动一步
ListNode* fast = head; // 快指针,每次移动两步
while (fast && fast->next) {
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
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);
ListNode* middleNode = findMiddleNode(head);
printf("Middle node: %d\n", middleNode->data); // 输出: Middle node: 3
return 0;
}
```
这个`findMiddleNode`函数首先检查链表是否为空或只有一两个节点,如果是则直接返回头节点。接着,慢指针每次移动一步,快指针每次移动两步。当快指针到达链表末尾时(即链表长度是奇数),慢指针正好位于中间;如果链表长度是偶数,此时慢指针会位于第二个中间节点前一个位置。最后返回慢指针所指向的节点。
阅读全文