在数据结构里,可以学到单链表 (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系统上运行的。
小编后续还会写如何用递归来实现某种功能在循环链表,双向链表等等数据结构
如果对大家有所帮助,就为小编点赞吧!