描述
利用单链表表示一个整数序列,利用递归的方法计算单链表中结点的个数。
输入
多组数据,每组数据有两行,第一行为链表的长度n,第二行为链表的n个元素(元素之间用空格分隔)。当n=0时输入结束。
输出
对于每组数据分别输出一行,对应链表中的各个结点个数。
输入样例 1
4 1 2 3 4 6 1 2 43 5 7 2 0
输出样例 1
4 6
思路(Findmax函数):
首先这个函数需要返回一个值,结合题目来看就是int类型的一个数,又,递归需要一个出口,那么可以得出:在出口处需要返回一个值。这个题是要求最大的值,需要遍历链表,那么最后遍历到链表的末尾,就说明到“出口”了,此时能返回的int类型的值就只有当前节点的data。所以可以写出:
if(l->next==NULL)//l已经是最后一个节点了 return l->data;
求最大值有一个经典思路是
int max=a[0]; for(int i=0;imax) max=a[i]; }
所以我们也需要不断地比较。上面说到遍历到最后我们会返回当前链表的data,那么这个返回值和谁比较呢?一定就是上一个节点的data,它俩一比,再返回这两个之中那个最大的,这其实也是递归思路的逆向思考过程了,先考虑返回值是什么,再考虑返回值要用来干什么(需要什么来做到这个目标)。
图片:
代码:
#includeusing namespace std; typedef struct LNode { int data; struct LNode* next; }*linklist, LNode; void Insert(linklist& l, int n) { l = new LNode; l->next = NULL; linklist rear = l; for (int i = 0; i < n; i++) { linklist p = new LNode; cin >> p->data; p->next = NULL; rear->next = p; rear = p; } } int Findmax(linklist l) { if (l->next == NULL) return l->data; else if (l->next->data > Findmax(l->next)) return l->next->data; else return Findmax(l->next); } int main() { int n; while (cin >> n && n != 0) { linklist l; Insert(l, n); cout< next)< 欢迎分享,转载请注明来源:内存溢出
评论列表(0条)