代码题(单链表2)

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;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值