递归算法:(传入的是二级指针变量)
思想:执行删除操作后递归自己当前指针,不执行删除操作时递归自己当前指针的指针域next
可以根据下图结合代码加以理解:
int Del_elems(Link *L, int e) {//不带头结点
Link p;
if ((*L)->data == e) {
p = *L;
*L = (*L)->next;
free(p);
Del_elems(L, e);//如果销毁,下次传入的指针是修改后的自己
}
else if ((*L)->next == NULL)
{
return OK;
}
else
{
Del_elems(&(*L)->next, e);//如果不销毁,下次传入的指针是自己的next指针,并且next指针也会根据上面的if自动判断是否更改next自己本身的值
}
return OK;
}
循环算法:(传入的是二级指针变量)
思想:首先一直循环当前指针,直到确定自己当前指针所指向的data值不是所要删除的值;至此传入的原指针不要再发生改变,剩下的交给临时指针完成。
临时指针:
p:前锋指针,负责探明自己所在位置的值是不是要删除的元素
q:p的影子,永远跟在p的前一位,确保p当前值为要删除的元素时,更改q自己的next值使其指向要删元素的下一位
r:替死鬼,p遇到要删的值时出现,代替p当前位置,p继续向前,r留在原地被释放。。。
代码如下:
int Del_elems_2(Link* L, int e) {
Link p, q, r;
while ((*L)->data == e) {
(*L) = (*L)->next;
}
p = (*L)->next;
q = *L;
while (1) {
if (p->data == e) {
r = p;
p = p->next;
q->next = p;
free(r);
}
else if (!p->next) {
return OK;
}
else {
q = p;
p = p->next;
}
}
}