其原理和链表删除某个结点是一样的,逻辑就是这个
下面附上详细解释,常规的删除方法代码如下
LinkList Dele_x(LinkList &L, int x)
{
LNode *p, *q, *pre;
p = L->next;
pre = L;
while (p != NULL)
{
if (p->data == x)
{
q = p;
p = p->next;
pre->next = p;
free(q);
}
else
{
pre = p;
p = p->next;
}
}
return L;
}
不用单独定义一个前驱指针来删 ,是不是看起来有点像递归那个代码了
LinkList Without_Qian_Dele_x(LinkList &L, int x)
{
LNode *p, *q;
p = L;
while (p->next != NULL)
{
if (p->next->data == x)
{
q = p->next;
p->next = p->next->next;
free(q);
}
else
{
p = p->next;
}
}
return L;
}
递归删除代码如下
void Del_x(LNode &L,int x)
{
if(L == NULL)
return 0;
if(L->data == x)
{
LNode *p;
p = L;
L=L->next;//暗含在这里,因为当不满足条件就要执行else语句,这里就相当于
//L->next = L->next->next;这个L的位置就是被删结点的前驱结点
free(p);
Del_x(L,x);
}
else
{
Del_x(L->next,x);//这个else语句暗含被删结点的前驱结点
}
}