已知head为单链表的表头指针,链表中存储的都是整形数据,实现下列运算的递归算法: i. 求链表中的最大值 ii. 求链表中的结点个数 ) iii.求所有整数的平均值 C语言
时间: 2024-12-12 18:24:08 浏览: 8
数据结构与算法 —— Java 实现(链表)
对于一个单链表,我们可以通过递归的方式来实现上述三种操作:
### 1. 求链表中的最大值 (Max Value)
```c
int findMax(struct ListNode* head) {
// 如果链表为空或只有一个节点,返回该节点的值就是最大值
if (head == NULL || head->next == NULL) {
return head->val;
}
// 否则,比较当前节点的值和其后继节点的最大值
int max = head->val; // 初始化max为当前节点值
return MAX(max, findMax(head->next)); // 递归调用自身处理剩余链表
}
```
### 2. 求链表中的结点个数 (Number of Nodes)
```c
int countNodes(struct ListNode* head) {
// 空链表没有节点,返回0
if (head == NULL) {
return 0;
}
// 非空链表有一个节点,返回1,并递归计数剩余节点
return 1 + countNodes(head->next);
}
```
### 3. 求所有整数的平均值 (Average Value)
由于链表是非连续存储的,所以不能直接计算总和再除以节点数得到平均值。我们需要一个辅助变量来累计总和,然后递归地累加节点值,同时递归地减去节点数。
```c
double calculateAverage(struct ListNode* head) {
// 初始化总和和节点数为0
double sum = 0.0;
int nodes = 0;
// 递归终止条件:当链表为空时,返回0
if (head == NULL) {
return 0.0;
}
// 递归处理剩余链表
sum += head->val;
nodes++;
return (calculateAverage(head->next) + sum) / nodes;
}
```
注意,在C语言中,`MAX()`函数通常是预定义的宏或自定义函数,这里我假设已经有了`MAX()`用于找到两个数中的较大值。
阅读全文