问题描述: 给定一个头结点为head的非空单链表,返回链表的中间结点。如果有两个中间节点,则返回第二个中间结点。 例如:程序输入: 1 2 3 4 5 程序输出: 3 用c语言作答
时间: 2024-06-24 13:02:04 浏览: 79
在C语言中,要找到一个单链表的中间节点,可以采用快慢指针的方法。快指针每次移动两步,慢指针每次移动一步,当快指针到达链表尾部时,慢指针正好位于链表的中间。如果链表有偶数个节点,慢指针会停在第二个中间节点。下面是这个问题的算法步骤:
1. 定义两个指针,分别命名为`slow`(慢指针)和`fast`(快指针),初始时都指向链表的头节点`head`。
2. `fast`指针先向前移动两个节点,`slow`指针每次移动一个节点。
3. 当`fast`指针遇到链表尾部(即`fast`为`NULL`)而`slow`指针不为`NULL`时,`slow`指针就是链表的中间节点。
4. 如果链表长度是偶数,那么此时`slow`指针之后的那个节点才是第二个中间节点。
下面是使用C语言实现的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 链表节点结构
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
// 找到链表的中间节点
ListNode* findMiddleNode(ListNode* head) {
if (head == NULL) 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() {
// 假设输入链表为 1 -> 2 -> 3 -> 4 -> 5
ListNode* head = malloc(sizeof(ListNode));
head->val = 1;
head->next = malloc(sizeof(ListNode));
head->next->val = 2;
head->next->next = malloc(sizeof(ListNode));
head->next->next->val = 3;
// ... 继续为链表添加元素
ListNode* middle = findMiddleNode(head);
printf("链表的中间节点值: %d\n", middle->val); // 输出 3
// 如果链表长度偶数,下一个节点的值将作为第二个中间节点
if (middle->next != NULL) {
printf("第二个中间节点值: %d\n", middle->next->val); // 输出 4
}
return 0;
}
```
阅读全文