无头单链表删除所有值为e的节点(递归算法)(四)-----考研数据结构题笔记

⌚️ 数据结构与算法考研笔记(四)

🎈🎈🎈 王老师加油加油!!!

⛵️ 题

设计一个递归算法,删除不带头结点的链表L中所有值为e的节点。

🤔 想法

假设Delete(L,e)是删除若L->data == e的节点,那么使用if判断L->data是否为e,是就执行删除,在进行下一个递归Delete(L,e),若不是就执行下一个递归Delete(L->next,e);
如下:
L == NULL; 返回;
L->next == e; 删除当前p所指节点;进入递归调用Delete(L,e);
L->next != e; 执行下一个节点删除,递归调用Delete(L->next,e);

❤️ 核心算法
//递归算法:删除链表中所有值为e的节点
bool DeleteLinkList(LinkList& L, ElemType e);
bool DeleteLinkList(LinkList& L, ElemType e) {
	if (L == NULL) return false;	//若空表,返回
	LNode* p = L;	
	if (L->data == e) {	//判断当前L所指向的是否为e值
		p = L;			//删除操作
		L = L->next;	//L指向下一个节点
		free(p);	//释放p节点
		DeleteLinkList(L, e);	//进行下一个,递归调用
	}
	else
		DeleteLinkList(L->next, e);	//进行下一个,递归调用
	return true;
}
⌛️ 无头链表测试
#include <iostream>
using namespace std;

typedef int ElemType;
typedef struct LNode {
	ElemType data;
	struct LNode* next;
	//int length;
}LNode, *LinkList;

//初始化无头链表L(这里采用头插法或尾插法)
bool InitLinkList(LinkList& L, int n);
bool InitLinkList(LinkList& L, int n) {
	L = new LNode;
	L = NULL;	//初始空表
	int e = 0;
	for (int i = 0; i < n; i++){
		cin >> e;
		LinkList s = new LNode;
		if (!s) return false;
		s->data = e;
		if (L == NULL)
			s->next = NULL;
		else
			s->next = L;
		L = s;
	}
	return true;
}

//递归算法:删除链表中所有值为e的节点
bool DeleteLinkList(LinkList& L, ElemType e);
bool DeleteLinkList(LinkList& L, ElemType e) {
	if (L == NULL) return false;	//若空表,返回
	LNode* p = L;	
	if (L->data == e) {	//判断当前L所指向的是否为e值
		p = L;			//删除操作
		L = L->next;	//L指向下一个节点
		free(p);	//释放p节点
		DeleteLinkList(L, e);	//进行下一个,递归调用
	}
	else
		DeleteLinkList(L->next, e);	//进行下一个,递归调用
	return true;
}

//遍历链表
bool PrintLinkList(LinkList L);
bool PrintLinkList(LinkList L) {
	if (L == NULL) return false;
	LinkList p;
	p = L;
	while (p) {
		if (p->next != NULL)
			cout << p->data << ",";
		else
			cout << p->data << endl;
		p = p->next;
	}
	return true;
}

int main() {
	LinkList L;
	int n,e;
	cin >> n;
	InitLinkList(L, n);
	cin >> e;
	if (DeleteLinkList(L, e))
		PrintLinkList(L);
	else
		cout << "fail to delete" << endl;

	system("pause");
	return 0;
}

在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏日的清晨

谢谢,只求点赞哟

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值