我写了一个递归来删除具有特定数据值的节点,但是它不能正常工作。

Node * removeAll(Node *top, char c){
    if(top == NULL)
        return NULL;

    Node *newTop;
    if(top->data == c){
        newTop = top->next;
        delete top;
    }else{
        newTop = top;
    }

    newTop->next = removeAll(newTop->next,c);

    return newTop;
}

提供给函数的链表包含值h e l l o我希望输出的列表包含值h e o,但它具有值h e l o

最佳答案

更改此:

if(top->data == c){
    newTop = top->next;
    delete top;
}else{
    newTop = top;
}

对此:
while(top && top->data == c){
    newTop = top->next;
    delete top;
    top = newTop;
}
newTop = top;

这样,包含目标值的连续元素将全部删除,然后再移至下一个元素。

顺便说一句,如果该函数是迭代而不是递归地编写的,则它可能会使用更少的内存并更快。

09-16 01:51