一、与线性表相关的删除操作
1、在带头结点的单链表L中,删除所有值为 x 的结点
// 单链表的定义
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
/*算法思想:p结点从头到尾扫描单链表,pre指向*p的前驱结点,*q指向值为x的结点,*/
void Delete_X(LinkList &L,ElemType x){
LNode *p,*q,*pre; // q 表示待删除结点
p = L->next;
pre = L;
while(p!=NULL){
if(p->data == x){
//pre->next = p->next
//free(p);
//p = pre->next;
q = p;
p = p->next;
pre->next = p;
free(q);
}else{
pre = p;
p = p->next;
}
}
}
2、在带头结点得单链表L中,删除最小值得结点
// 单链表的定义
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
/*
算法思想:首先遍历整个链表找到最小值结点,然后进行删除,
指针p用来遍历整个链表,pre指向p的前驱,
minp指向最小值结点,minpre指向最小值结点的前驱
扫描过程中,如果 p->data < minp->data ,将 pre 和 p的值赋值给 minpre 和 minp
扫描完毕,minp指向最小值结点,minpre 指向最小值结点的前驱
*/
LinkList Delete_min(LinkList &L){
LNode *pre = L;
LNode *p = pre->next;
LNode *minp = p;
LNode *minpre = pre;
while(p!=NULL){
if(p->data < minp->data){ // 找到比之前小的结点
minp = p;
minpre = pre;
}
pre = p; // 继续扫描下一个结点
p = p->next;
}
minpre->next = minp->next; // 删除最小值结点
free(minp);
return L;
}
3、在带头结点的无序单链表L中,删除表中值介于m和n之间(m<n)的值
// 单链表的定义
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
/*算法思想:遍历整个链表,找到符合条件的结点,进行删除*/
void Delete_Range(LinkList &L,int min,int max){
LNode *pre = L;
LNode *p = L->next;
while(p!=NULL){
if(p->data > min && p->data<max){
pre->next = p->next; // 删除指定结点
free(p);
p = pre->next;
}else{ // 寻找下一个结点
pre = p;
p = p->next;
}
}
}
4、在一个递增有序的单链表中,删除重复的元素
// 单链表的定义
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
/*算法思想:因为是有序表,所以重复的元素是相邻的*/
viod Delete_Same(LinkList &L){
LNode *pre = L->next;
LNode *p = pre->next;
while(p!=NULL){
if(pre->data == p->data){ // 找到重复结点
pre->next = p->next; // 释放相同元素结点
free(p);
p = pre->next
}else{
pre = p;
p = p->next;
}
}
}
二、与顺序表之间的对比
1、删除最小值元素:
顺序表:搜索整个顺序表,查找最小元素并记住其位置,搜索结束后用最后一个元素填补空出的最小值的位置
单链表:首先遍历整个链表找到最小值结点,然后进行删除,指针p用来遍历整个链表,pre指向p的前驱,minp指向最小值结点,minpre指向最小值结点的前驱
扫描过程中,如果 p->data < minp->data ,将 pre 和 p的值赋值给 minpre 和 minp
扫描完毕,minp指向最小值结点,minpre 指向最小值结点的前驱
2、删除所有值为 x 的元素
顺序表:遍历顺序表,将不是 x 的元素保留下来 (删除所有 x 的元素)
单链表:双指针法,p结点从头到尾扫描单链表,pre指向*p的前驱结点,pre->next = p->next
free(p); p = pre->next;
3、删除表中值介于m和n之间(m<n)的值
顺序表:遍历顺序表,保留下符合要求的结点。
单链表:遍历整个链表,找到符合条件的结点,进行删除。
4、删除重复元素
顺序表:第一个元素肯定不重复,两个指针 i,j 依次向后扫描,元素不重复就保留,重复的元素不保留(双指针法)
单链表:因为是有序表,所以重复的元素是相邻的,比较删除。
具体顺序表相关的删除,请点击:数据结构代码题--与线性表的相关删除操作_XUN~MLF的博客-CSDN博客