您的位置:首页 > 其它

使用递归来实现删除单链表中最后一个节点不是数字‘2’

2017-07-24 07:43 288 查看
之前,小编已经写了如何在单链表中删除第一个节点不是数字‘2’ 的代码,那现在改变题目一下,就是如何删除单链表中最后一个节点不是数字‘2’。

其实,思路跟删除第一个节点有点相似,就是得用递归来traverse到最后一个节点,然后进行判断最后一个节点是否是数字‘2’。

下面是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 already written
list();
~list();
void build();
void display();

//This is the prototype for this question
//Remove the last node if the last node is not 2
void remove_last();

private:
//Remove the last node if the last node is not 2
void remove_last(node *& tail, node * head);

node * head;
node * tail;
};


我相信,很多人就会觉得直接用tail指针来判断最后一个节点是否是2,如果不是2,那就直接删除,那tail指针就得指向倒数第二个节点上,不然就会出seg fault,所以就得用head指针来进行traverse到倒数第二个节点上,来进行判断最后一个节点。因为是更改链表,就得pass by reference,不能pass by value,所以在prototype上写的是node *& tail。

下面是实现这个函数的代码展示:

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

void list::remove_last()
{
remove_last(tail,head);
}

void list::remove_last(node *& tail, node * head)
{
if(!head)
return;
if(!head->next->next)
{
if(head->next->data != 2)
{
delete head->next;
head->next = NULL;
tail = head;
return;
}
else
return;
}
remove_last(tail,head->next);
}


上面就是如何实现这道题的代码,感觉是不是挺简短精辟呢!其实递归就是能使代码量缩小的,而且能让别人很清楚你的思路是什么样的。

<
9dda
p>下面是结果展示:



如果最后一个节点是2的话,就不删除,结果同样展示出来给你们看看:



是不是感觉很神奇呢,递归就是这么神奇!

下次,小编还会继续使用递归来实现不同数据结构中的不同功能,敬请期待哦!

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