2.试编写在带头结点的单链表L中删除一个最小值节点的高效算法(假设该节点唯一/不唯一)
//删除最小值
<----2.试编写在带头结点的单链表L中删除一个最小值节点的高效算法(假设该节点唯一)-题目一---->
/*算法思想:用p从头至尾扫描单链表,pre指向*p节点的前驱,用minp保存值最小的节点指针(初值为p),minpre指向*minp的前驱(初值为pre),
一边扫描一边比较,若p->data<minp->data,则将p,pre分别赋给minp,minpre。
当扫描结束时,minpre->next=minp->next;
时间复杂度:O(n),空间复杂度:O(1)
要删除节点,需要找到前驱节点,所以时间复杂度为O(n),所以用双指针的方法,又因为要找到最小值,所以需要两个指针存储最小值*/
LinkList Listdelete(LinkList &L) {
LNode *pre=L;//第0个节点是头结点,pre指向*L,节点的data域默认值为0
LNode *p=L->next;//p指向*L->next,使p指向第一个节点
LNode *minp=p;
LNode *minpre=pre;
while(p!=NULL) {//头节点是第0个节点
if(p->data<minp->data) {//如果p->data<minp->data,则将p,pre分别赋给minp,minpre
minpre=pre;//pre指向*minp的前驱
minp=p;//minp指向*p
}
pre=p;
p=p->next;
}
minpre->next=minp->next;//将minp->next赋值给*minpre->next
free(minp);
return L;
}
<----2.试编写在带头结点的单链表L中删除一个最小值节点的高效算法(假设该节点不唯一)-题目二---->
void DeleteMinNodes(LinkList L) {
if (L->next == NULL) {
// 链表为空,无法删除
return;
}
LNode* pre = L;
LNode* p = L->next;
int minValue = p->data;
// 找到最小值节点的数值
while (p != NULL) {
if (p->data < minValue) {
minValue = p->data;
}
p = p->next;
}
// 删除所有最小值节点
pre = L;
p = L->next;
while (p != NULL) {
if (p->data == minValue) {//如果p->data==minValue,则删除p
pre->next = p->next;//将*pre->next=*p->next
free(p);//释放p
p = pre->next;
} else {
pre = p;
p = p->next;
}
}
}