c 语言给定一个带表头的单链表,只允许一边扫描,定位该链表中点元素,并输出共有多少元素,中点元素是第几个,值为多少
时间: 2024-10-14 07:12:21 浏览: 21
Leetcode 刷题(8)简单单链表: 删除链表倒数第N个元素
5星 · 资源好评率100%
在C语言中,如果我们要找到一个单链表的中间元素并统计节点数量,可以使用快慢指针的方法,也被称为“双指针”技巧。以下是基本步骤:
1. 初始化两个指针,一个称为`slow`(慢速),速度每次移动一步;另一个称为`fast`(快速),速度每次移动两步。
2. 首先将`fast`指向链表头部,然后开始遍历。
3. 当`fast`到达链表的末尾时(即`fast`和`fast->next`都为空),`slow`就是中点。这时,我们可以计算`slow->next`之前的所有节点数,这是链表的一半长度。同时,`slow`的下一个节点就是中点元素。
4. 输出总元素数、中点元素的位置(从0开始计数)以及中点元素的值。
如果链表长度为偶数,中点有两个节点,那么输出其中一个即可。
```c
struct ListNode *findMiddle(struct ListNode* head) {
struct ListNode *slow = head;
struct ListNode *fast = head;
while (fast && fast->next) {
slow = slow->next;
fast = fast->next->next;
}
// Now 'slow' is at the middle or one step before it
int total_length = 0;
if (fast == NULL) { // Even length, take half of slow's distance
total_length = slow - head + 1;
return slow; // Middle element value
} else { // Odd length, slow points to the middle
total_length = slow - head + 1;
return slow->next; // Middle element value
}
}
```
阅读全文