如何使用C++递归来删除单链表中某一个由用户输入特定的值
来源:互联网 发布:unity3d 导出web 编辑:程序博客网 时间:2024/06/03 22:42
之前小编写了一些关于用C++递归来实现某种功能在不同的数据结构中,现在,小编还继续用递归来实现在单链表(LLL)中删除某一个特定的值,说明,因为小编所学的都是英文教材,所以在写的时候会夹杂着英文来进行表达,多学点英语还是好处的,再说了代码就是字母。
回归正题,为了解决这道题,就需要要特别考虑到尾指针(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; head = 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 不是最后一个节点或者是最后两个节点,随便输入链表里有的数字,看结果对不对。
下面是这种情况的展示:
再运行一次看看结果:
可以看出,同样能实现这个功能。
如果对大家有所帮助,就为小编点赞吧!
阅读全文
1 0
- 如何使用C++递归来删除单链表中某一个由用户输入特定的值
- c语言---输入一个字符串,删除其中的某一个字符
- 使用ID号来删除特定文档
- C语言删除特定值
- 在分页中控制由用户输入页码来跳转的JS函数
- ubuntu删除特定用户的进程
- 删除单链表中特定值
- oracle 删除某一个用户底下所有的表数据
- MySQL批量去掉某一个字段特定的值
- 使用递归来实现在ARR里如何删除每一个list的第一个节点不是数字‘2’
- 使用WM_CHAR消息来限制用户的输入
- 使用ValidationRule类来检查用户输入的有效性
- 如何删除RichTextBox里的特定行
- C#XML删除某一个节点
- Objective-c 根据某一个时区的时间获取特定时区的时间
- 在浏览器中一键调用QQ和某一个特定用户交流
- 使用如何取出windows系统用户输入的闲置时间
- 如何控制用户的输入
- java基础之一多线程
- Machine Learning Notes III
- 正向代理与方向代理
- iOS 符号表恢复 & 逆向支付宝
- java集合LinkHashMap
- 如何使用C++递归来删除单链表中某一个由用户输入特定的值
- 如何将既有项目重构成 MVP 模式
- Spring笔记01-Spring概览
- logistic回归
- 内容耦合
- es6 Generator (十五)
- Installing MariaDB Binary Tarballs
- Web知识点
- 设计模式(13) 享元模式(简单入门 结构模式)