之前,小编已经写了如何在单链表中删除第一个节点不是数字‘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);
}
上面就是如何实现这道题的代码,感觉是不是挺简短精辟呢!其实递归就是能使代码量缩小的,而且能让别人很清楚你的思路是什么样的。
下面是结果展示:
如果最后一个节点是2的话,就不删除,结果同样展示出来给你们看看:
是不是感觉很神奇呢,递归就是这么神奇!
下次,小编还会继续使用递归来实现不同数据结构中的不同功能,敬请期待哦!
记得为小编点赞哦!!