如何使用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 不是最后一个节点或者是最后两个节点,随便输入链表里有的数字,看结果对不对。
下面是这种情况的展示:
结果展示
再运行一次看看结果:
结果展示

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

如果对大家有所帮助,就为小编点赞吧!