使用递归算法

时间:2017-11-23 18:27:19

标签: c algorithm list recursion iteration

在线和书籍我发现了一些关于使用迭代方法反转列表的算法,像这样我认为这是常用的算法

link listReverse(link x) {
    link t, y = x, r = NULL;
    while (y != NULL) {
        t = y->next;
        y->next = r;
        r = y;
        y = t;
    }
    return r;
}

注意:节点以这种方式实现:

typedef sturct node *link:
struct node {
    item Item;
    link next;
};

我在弄清楚这个算法是如何工作的时候遇到了一些问题,我做了这个:

link init() {
    link x;

    x = malloc(sizeof *x);

    x->next = NULL;

    return x;
}

link listReverse(link start) {
    link newNode = init();

    listReverseR(start, newNode, 1);

    return newNode;
}

link listReverseR(link start, link n, double start_d) {

    if (start == NULL)
        return n;

    n = listReverseR(start->next, n, 0);
    n->next = (start_d) ? NULL : start;
    return n->next;
}

好吗?复杂性是否相等?迭代的是O(n),我认为这也是O(n)。

P.S。递归代码基于带有虚拟头的列表,因此init()函数将此虚拟节点初始化为新列表的开头。

0 个答案:

没有答案