使用递归来解决在单链表里删除第一节点不是数字‘2’

在数据结构里,可以学到单链表 (linear linked list), 循环链表(circular linked list), 双向链表 (Double linked list) 等等数据结构,今天,博主将使用C++递归来实现在单链表的一些操作,本人经常使用递归来实现,几乎忘记用循环来实现问题了。OK,咋们进入正题。

首先,我相信大家应该都会用class 和 struct来一起建立单链表了,所以,博主就将需要用到的代码的prototype写出来。

下面是“list.h” 文件里的prototype 和 struct 。

//list.h
#include<iostream>
#include<cstring>
#include<cctype>

using namespace std;

struct node
{
    int data;
    node * next;
}; 

class list
{
    public:
        //These function already written
        list();
        ~list();
        void build();
        void display();

    private:
        node * head;
        node * tail;
};

大家有所发现,这个单链表里,使用到了head 和 tail 指针,head 指针是指向第一个节点,tail指针是指向最后一个节点,有时候用tail指针来实现某些功能时,是很有帮助,就不需要用head指针来进行traverse。比如,要判断最后一个节点是否是数字’2’,这种情况用tail指针来实现是很快的。但是,有时候要实现某些功能时,tail指针是必须考虑很清楚,不然就会出现seg fault。

回归正题,为了实现“在单链表里删除第一节点,如果第一节点不是数字’2’”。那这时候,就得先在“list.h”里,写好prototype。因为要用递归来实现,那么就得使用wrapper function 和 recursive function。wrapper function 是写在public 里面的, recursive function 是写在private里面的。

下面是在”list.h” 文件里写prototype。

//list.h
//头文件那些不写了,跟上面是一样的
class list
{
    public:
        //Remove the first node if the first node is not 2
        void remove_first();

    private:
        void remove_first(node *& head);
};

那么,为了implement这些function,那么就得在”.cpp”文件里实现。

下面是”list.cpp”里面的代码

//list.cpp
#include "list.h"

void list::remove_first()
{
    remove_first(head);
}

void list::remove_first(node *& head)
{
    if(!head)
        return;
    if(head->data != 2)
    {
        node * temp = head->next;
        delete head;
        head = NULL;
        head = temp;
        return;
    }
}

这就是如何用递归来实现这一功能,是不是感觉用递归能将代码行数缩小,而且还很容易理解呢!!

下面是结果展示,小编是在linux系统上运行的。
这是结果的截图

小编后续还会写如何用递归来实现某种功能在循环链表,双向链表等等数据结构
如果对大家有所帮助,就为小编点赞吧!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值