已知L是单链表(不带头结点)的表头指针,链表中存储的都是整型数据,试写出用c++实现下列运算的递归算法: 1)求链表中的最大整数。 2)求链表的结点个数。 3)求所有整数的平均值。
时间: 2024-11-05 21:32:37 浏览: 33
已知head为单链表的表头指针,链表中存储的都是整形数据,实现下列运算的递归算法
4星 · 用户满意度95%
以下是用 C++ 实现单链表(不带头结点)上述操作的递归算法:
1) **求链表中的最大整数**:
```cpp
int findMax(ListNode* L, int maxSoFar = INT_MIN) {
if (L == nullptr)
return maxSoFar;
else if (maxSoFar < L->val)
maxSoFar = L->val;
return findMax(L->next, maxSoFar);
}
```
这里假设 `ListNode` 是链表节点的结构体,包含一个整数值 `val` 和指向下一个节点的指针 `next`。
2) **求链表的结点个数**:
```cpp
int countNodes(ListNode* L, int count = 0) {
if (L == nullptr)
return count;
else
return countNodes(L->next, count + 1);
}
```
递归终止条件是当 L 指向空时,计数器返回。
3) **求所有整数的平均值**:
由于递归无法直接计算平均值,因为我们需要遍历整个链表。但是可以先递归地计算总和,然后除以结点总数。注意,这里需要非递归的方式来获取总和和节点数。首先递归地获取总和:
```cpp
int sum(ListNode* L, int total = 0) {
if (L == nullptr)
return total;
else
return sum(L->next, total + L->val);
}
double average(ListNode* L) {
int total = sum(L);
int nodes = countNodes(L);
return (double)total / nodes;
}
```
最后调用 `average` 函数即可得到平均值。
阅读全文