递归删除链表中的指定元素x

来源:互联网 发布:比特精灵软件下载 编辑:程序博客网 时间:2024/06/05 19:34

/*
问题描述:递归删除链表中的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;    }}
//递归删除元素xvoid 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;
原创粉丝点击