递归删除链表中的指定元素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;
阅读全文
0 0
- 递归删除链表中的指定元素x
- 递归实现删除链表中值为x的元素
- 删除ArrayList中的指定元素
- 删除链表中的元素
- 删除链表中的元素
- 删除链表中的元素
- 删除链表中的元素
- 删除链表中的元素
- 删除链表中的元素
- 删除链表中的元素
- 删除链表中的元素
- 删除链表中的元素
- 删除链表中的元素
- 删除链表中的元素
- 删除链表中的元素
- 删除链表中的元素
- 删除链表中的元素
- 删除链表中的元素
- 最短排序数组(动态规划)
- 用C2制作小游戏
- Jzoj4604 树
- Construction sets 二分+背包
- The C Programming Language 练习题2-7
- 递归删除链表中的指定元素x
- [LeetCode]20. Valid Parentheses
- C语言习题一
- 前端之路——jquery第一课
- xml入门
- 【死磕Java并发】-----J.U.C之线程池:ThreadPoolExecutor
- DB2 根据表名查找存储过程
- dinner party dp 暴力
- C++ MFC / VS2013 之十二 (对话框:向导对话框的创建及显示)