递归链表差异

时间:2016-12-11 03:24:36

标签: c++ recursion linked-list

我刚从教科书中得到了这个问题,但我似乎无法弄清楚答案是什么。这个问题要求"用一句话解释这个功能是做什么的,以及什么是坏的'关于这个功能?" (它与编程风格无关)。

顺便说一句,差异是什么 之间"返回f(x,p->下一个)"和" p-> next = f(x,p-> next)" ?我似乎无法弄清楚这两者之间的区别。

struct Node {
    int data;
    Node* next;
};

Node* f(int x, Node* p) {
    if (p == nullptr) {
        return nullptr;
    }
    else if (p->data == x) {
        return f(x, p->next);
    }
    else {
        p->next = f(x, p->next);
        return p;
    }
}

1 个答案:

答案 0 :(得分:2)

f执行的操作是遍历链接列表,删除包含值x的所有元素。

else if (p->data == x) { // if the next element has our target value
    return f(x, p->next); // make that element's next element, become our own next element
}

有什么不好的是std::vector存在,而

vec.erase(std::remove(vec.begin(), vec.end(), x), vec.end());

不是最优雅的代码行,它比递归指针函数更容易理解和识别。

f也会泄漏记忆。删除的元素不会被删除; f只是覆盖知道它的位置的指针。