如何使用C++递归来删除单链表中某一个由用户输入特定的值
2017-07-24 14:41
405 查看
之前小编写了一些关于用C++递归来实现某种功能在不同的数据结构中,现在,小编还继续用递归来实现在单链表(LLL)中删除某一个特定的值,说明,因为小编所学的都是英文教材,所以在写的时候会夹杂着英文来进行表达,多学点英语还是好处的,再说了代码就是字母。
回归正题,为了解决这道题,就需要要特别考虑到尾指针(tail pointer),因为在.h 文件里有用head pointer 和 tail pointer 来建立单链表。
下面是展示 list.h 文件里的代码:
下面是展示 list.cpp 文件里的代码
已经写完代码,那为了运行看结果,代码写的对不对,那就得注意几种特殊情况,这几种特殊情况都没问题,那就说明这代码写的是对了。
第一种特殊情况:最后两个node 都是special node
第二种特殊情况:倒数第二个node是special node
下面是展示特殊的情况的结果,因为如果最后两个的节点都是special node, 这种情况是很特殊的
大家可以看到,初始的链表里,最后两个节点都是‘2’,那么就得删除掉
下面是展示第二种特殊情况的结果:
可以看到,也可以将special node 删除掉。
既然,这两个特殊情况解决了,那继续运行看结果,如果随便输入的special node 不是最后一个节点或者是最后两个节点,随便输入链表里有的数字,看结果对不对。
下面是这种情况的展示:
再运行一次看看结果:
可以看出,同样能实现这个功能。
如果对大家有所帮助,就为小编点赞吧!
回归正题,为了解决这道题,就需要要特别考虑到尾指针(tail pointer),因为在.h 文件里有用head pointer 和 tail pointer 来建立单链表。
下面是展示 list.h 文件里的代码:
//list.h #include<iostream> #include<cstring> #include<cctype> using namespace std; struct node { int data; node * next; }; class list { public: //These function are written list(); ~list(); void build(); void display(); //Write the function prototype //这里就得先写wrapper function prototype //Remove the special node which comes from user void remove_special(); private: //Write the function prototype //这里就写recursive function prototype //因为改变了单链表的结构,所以就得pass by reference void remove_special(node *& tail, node *& head, int num); node * head; //tail pointer是一直指向最后一个节点的 node * tail; };
下面是展示 list.cpp 文件里的代码
//list.cpp #include "list.h" void list::remove_special() { int num; cout<<"Which num do you want to remove: "; cin>>num; remove_special(tail,head,num); } void list::remove_special(node *& tail, node *& head, int num) { if(!head) return; //这个使用来判断head 指针指向的节点是不是最后一个节点 if(head->next != tail) { //这个是用来判断head指针现在所指的节点是不是special node //如果是special node, 那就执行删除操作 if(head->data == num) { node * temp = head->next; delete head; hea a6c4 d = NULL; //现在的head 指针是指向special node 的下一个node head = temp; //实现递归 //所以在递归调用里就不需要head->next来进行traverse remove_special(tail,head,num); } } else { if(tail->data == num) { delete tail; tail = NULL; head->next = NULL; tail = head; return; } //这是用来判断倒数第二个节点是否是special node if(head->data == num) { delete head; head = NULL; head = tail; return; } } remove_special(tail,head->next,num); }
已经写完代码,那为了运行看结果,代码写的对不对,那就得注意几种特殊情况,这几种特殊情况都没问题,那就说明这代码写的是对了。
第一种特殊情况:最后两个node 都是special node
第二种特殊情况:倒数第二个node是special node
下面是展示特殊的情况的结果,因为如果最后两个的节点都是special node, 这种情况是很特殊的
大家可以看到,初始的链表里,最后两个节点都是‘2’,那么就得删除掉
下面是展示第二种特殊情况的结果:
可以看到,也可以将special node 删除掉。
既然,这两个特殊情况解决了,那继续运行看结果,如果随便输入的special node 不是最后一个节点或者是最后两个节点,随便输入链表里有的数字,看结果对不对。
下面是这种情况的展示:
再运行一次看看结果:
可以看出,同样能实现这个功能。
如果对大家有所帮助,就为小编点赞吧!
相关文章推荐
- 输入一组整型元素序列,使用尾插法建立一个带有头结点的单链表。 ② 实现该线性表的遍历。 ③ 在该单链表的第i个元素前插入一个整数。 ④ 删除该单链表中的第i个元素,其值通过参数将其返回。 ⑤ 建立两个
- (2)单链表的操作 ① 输入一组整型元素序列,使用尾插法建立一个带有头结点的单链表。 ② 实现该线性表的遍历。 ③ 在该单链表的第i个元素前插入一个整数。 ④ 删除该单链表中的第i个元素,其值通过参数
- 使用jQuery动态创建一个表格(根据用户输入的内容添加一行数据,并且能逐行删除)
- 如何编程实现删除一个sap的在线用户
- Oracle 中如何删除一个用户拥有的所有对象
- 假如你想输入一个用户姓名,那么如何用C#语言判断该姓名在数据库中是存在的呢?
- 如何编程实现删除一个sap的在线用户
- 如何编程实现删除一个sap的在线用户
- 删除邮箱存储时,您会收到一条"c1034a7f"错误消息:"一个或多个用户当前使用此邮箱存储"
- 如何在一个已排序的NSArray中搜索某一特定字符串?答案是使用CFArray自带的搜索功能:
- 如何编程实现删除一个sap的在线用户
- 交互式让用户输入一个文件路径,判断文件是否存在,若存在判断文件类型,若文件是普通文件,不能使用wc。
- 如何同一时间一个帐号只有一个用户使用?(asp.net)
- 批处理如何做到等待用户输入一个值(dos命令行)
- 『管理调优』如何确定一个回滚段被哪个用户使用
- 如何编程实现删除一个SAP的在线用户
- 如何编程实现删除一个sap的在线用户
- 如何让诊断功能不需要输入APPS口令 &监控用户当前在使用那个表单?
- Oracle中,如何删除一个用户下的所有表
- 如何同一时间一个帐号只有一个用户使用?(asp.net)