使用递归计算双向链表的节点数

时间:2016-04-08 22:56:48

标签: recursion linked-list doubly-linked-list

这是我到目前为止所做的:

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并且我无法前进。

1 个答案:

答案 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
    }
}

在每个递归步骤中,您创建一个新的列表对象,将其指向当前列表的第二个元素,然后继续。这对你有用吗?