⌚️ 数据结构与算法考研笔记(四)
🎈🎈🎈 王老师加油加油!!!
⛵️ 题
设计一个递归算法,删除不带头结点的链表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;
}