// ... existing code ... int Length( List L ) { int count = 0; List p = L; while (p != NULL) { count++; p = p->Next; } return count; } // ... existing code ...
时间: 2025-06-26 20:20:19 浏览: 11
### C语言中计算链表长度的函数实现
在C语言中,可以通过遍历整个链表来统计节点的数量从而得到链表的长度。以下是基于此逻辑的一种常见实现方式:
#### 单链表长度计算函数
通过定义一个计数器变量 `count` 来记录当前已访问过的节点数量,在循环过程中逐步增加该计数器直到达到链表尾部。
```c
// 定义单链表结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
int getLength(Node* head) {
int count = 0; // 初始化计数值为零
Node* current = head; // 当前指针指向头部
while (current != NULL) { // 如果不是空,则继续处理下一个节点
count++; // 增加计数器
current = current->next; // 移动到下一节点
}
return count; // 返回最终计数值作为链表长度
}
```
上述代码片段展示了一个简单的获取单向链表长度的方法[^3]。它利用了while循环不断迭代直至遇到NULL为止,并在此期间累加每一个有效节点至总长度之中。
#### 双指针法寻找中间位置并间接得出长度
另一种方法可以采用双指针技术不仅能够找到链表中的中心点还可以顺便知道大概的一半长度。这种方法特别适用于某些特定场景下既想获得长度又希望定位某个特殊位置的情况。
```c
void findMiddleAndCount(Node *head, int *length){
Node *slow = head,*fast=head;
*length=0;
if(!head)return ;
do{
(*length)++;
slow=slow->next;if(fast && fast->next)fast=(fast->next)->next;
}while(fast&&fast->next);
}
/* 调用示例 */
Node* head = ... ; // 已经构建好的链表头结点
int length;
findMiddleAndCount(head,&length);
printf("The list has %d nodes.\n",length);
```
这里提供了另一个版本的解决方案,其中使用了两个速度不同的指针(`slow`, `fast`)来进行操作。当快速移动的那个到达终点时,慢速那个正好处于列表正中央附近的位置上,同时我们也可以借此机会完成对整体规模的一个粗略估计。
#### 性能分析
以上两种方案的时间复杂度均为 O(n),因为都需要至少一次完整的线性扫描才能确定确切的结果。空间消耗方面则保持常量级别即 O(1),不需额外分配内存资源用于辅助存储数据项之外的信息。
---
阅读全文
相关推荐














