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

之前小编写了一些关于用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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值