这是我到目前为止所做的:
struct rep_list {
struct node *head;
struct node *tail;
}
typedef rep_list *list;
int length(const list lst) {
if (lst->head == NULL) {
return 0;
}
else {
lst->head = lst->head->next;
return 1 + length(lst);
}
}
这样可行,但函数接受的列表头部作为参数被更改。我不知道如何解决这个问题。
我不允许更改函数定义,因此它应该始终接受列表变量。
有什么想法吗?
编辑:我试图做Tyler S在评论中提出的建议,但我遇到了另一个问题。如果我在开头创建一个node *变量,它应该指向lst-> head。但是然后每次递归调用函数都会将值更改回lst-> head并且我无法前进。答案 0 :(得分:1)
您不需要本地节点:只是不要更改列表头。相反,将 next 指针作为递归头传递。
int length(const list lst) {
if (lst->head == NULL) {
return 0;
}
else {
return 1 + length(lst->head-next);
}
}
我明白了。好的;由于选择的表示,这有点笨拙。您需要一个临时变量来包含剩余的列表。这包括改变头部。
int length(const list lst) {
if (lst->head == NULL) {
return 0;
}
else {
new_lst = new(list)
new_lst->head = lst->head->next;
var result = 1 + length(new_lst);
free(new_lst)
return result
}
}
在每个递归步骤中,您创建一个新的列表对象,将其指向当前列表的第二个元素,然后继续。这对你有用吗?