递归删除链表中的指定元素x
程序员文章站
2022-03-22 10:09:09
...
/*
问题描述:递归删除链表中的x
说明:此处要注意的是,在递归删除x的时候,中间并没有产生断链。因为函数传递的是引用。
关于引用,这次又详细的查了一下。特说明如下:
其实引用,在教材上被解释成别名。就是给变量另起一个名字。从本质上说,其实并没有引用这回事,引用的内部实现过程还是利用指针来实现的。
比如说:int i; int &j = i; 然后我们就可以说j是i的引用了,在编译器编译的时候,一般来说,它会把上面的第二条语句翻译成这样,
int const *j = &i;然后在程序中所有用到j的地方都用*j来代替。只是对于我们来说,这个过程被屏蔽了。我们不用再去管j这个指针,使用时直接当成和i相似的变量就行。个人觉得普通的变量用引用没什么必要,在C++中更多的当成指针的引用来传递参数,使得在函数内部可以改变指针所指的对象,这个在链表中用的较多。其实在也可以用C语言的二重指针实现,可能是因为二重指针有点烦,易出错,所以C++才规定了引用这个东西,把引用给包装了起来。在深入一点,JAVA中连指针也没有了,应该是在C++的基础上用了更高层次的封装了吧。
*/
//删除x(普通方法)
void Delete_x(LinkList &L,int x)
{
LNode *p = L,*q;
while(p->next !=NULL)
{
q = p->next;
if(x == q->data)
{
p->next = q->next;
delete q;
}
else
p = p->next;
}
}
//递归删除元素x
void Del_xByRecursion(LinkList &L,int x)
{
LNode *p;
if(L == NULL) //如果为空,则返回
return ;
if(L->data == x) //如果L指向x,则删除当前指针
{
p = L;
L = L->next; //注意此处并没有造成短链,因为函数传递的是引用的缘故
delete p;
Del_xByRecursion(L,x);
}
else
Del_xByRecursion(L->next,x);
}
附:
//测试引用的功能代码
LinkList L = new LNode;
L->data = 3;
LinkList p1 = new LNode;
p1->data = 4;
LinkList p2 = new LNode;
p2->data = 5;
L->next = p1;
p1->next = p2;
p2->next = NULL;
cout<<"sizeof(*L)"<<sizeof(LNode)<<endl;
cout<<"L:"<<L<<endl;
cout<<"&L->data:"<<&(L->data)<<endl;
cout<<"&L->next:"<<&(L->next)<<endl;
cout<<"L->next:"<<L->next<<endl;
LinkList &L2 = L->next;
cout<<"L2->data:"<<L2->data<<endl;
p1 = L2;
L2 = L2->next;
delete p1;
//输出链表中的元素
while(L != NULL)
{
cout<<L->data<<" ";
L = L->next;
}
cout<<endl;
上一篇: 根据指定的元素删除数组中相同的元素
下一篇: Java数组删除指定元素