已知为单链表的表头指针,链表中存储的都是整型数据,试写出实现下列运算(1)求链表中的最大整数。 的递归算法: (2)求链表的结点个数。 (3)求所有整数的平均值。c语言,写出算法思想
时间: 2024-10-22 10:27:07 浏览: 16
已知head为单链表的表头指针,链表中存储的都是整形数据,实现下列运算的递归算法
4星 · 用户满意度95%
(1) 递归算法思想:对于求链表中的最大整数,我们可以采用分治法的思路,递归地比较当前节点的数值和它后继节点的最大值。如果当前节点的数值大于已知的最大值,则更新最大值;然后对下一个节点继续这个过程,直到遍历到链表的末尾。
```c
int maxInList(struct ListNode* head) {
// 如果链表为空,返回无穷小作为默认最大值
if (head == NULL) return INT_MIN;
// 当只有一个节点时,它是最大的
int currentMax = head->val;
if (head->next == NULL) return currentMax;
// 递归查找剩余部分的最大值,并与当前节点比较
int nextMax = maxInList(head->next);
return head->val > nextMax ? head->val : nextMax;
}
```
(2) 求链表结点个数的递归算法:同样可以采用递归的方式,每次递归处理当前节点,然后继续对后继节点递归,直到链表空为止。
```c
size_t countNodes(struct ListNode* head) {
if (head == NULL) return 0; // 空链表结束递归
return 1 + countNodes(head->next); // 返回当前节点加上剩余节点的数量
}
```
(3) 计算平均值的递归算法:需要先计算链表总和,然后除以节点总数。由于我们已经有了节点个数的函数,可以在那个函数内部添加累加和的操作,然后在返回时一并返回平均值。
```c
double averageInList(struct ListNode* head) {
if (head == NULL) return 0.0; // 空链表,平均值为0
size_t nodeCount = countNodes(head);
long long sum = 0;
while (head != NULL) {
sum += head->val;
head = head->next;
}
return (double)sum / nodeCount;
}
```
阅读全文