其实算法实现很容易,但主要是里面的细节问题
//递归删除重复的元素
bool recursionDelete(Linklist &ls, int target) {
if (ls == NULL) {
return false;
}
Node* p = NULL;
if (ls->data == target) {
p = ls;
ls = ls->next;
free(p);
recursionDelete(ls,target);
}
else {
recursionDelete(ls->next,target);
}
return true;
}
为什么这段代码在执行 ls = ls->next 会误以为有断链的感觉
原因是没有理解引用传递的本质
bool recursionDelete(Linklist &ls, int target)
可以发现形参使用了引用参数传递。引用就是起“别名”,传递过来的参数依旧是实参的内容。
所以再执行ls=ls->next时候 相当于是 ls->next=ls->next->next 是让ls的指针域指向下一结点的下一结点,而不是让指向ls的指针指向下一结点