您的位置:首页 > 编程语言 > C语言/C++

如何使用C++递归来删除单链表中某一个由用户输入特定的值

2017-07-24 14:41 405 查看
之前小编写了一些关于用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;
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 不是最后一个节点或者是最后两个节点,随便输入链表里有的数字,看结果对不对。

下面是这种情况的展示:



再运行一次看看结果:



可以看出,同样能实现这个功能。

如果对大家有所帮助,就为小编点赞吧!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐