考研数据结构(每日一题)day09

146 阅读1分钟

考研数据结构(每日一题)

题目:试编写带头节点的单链表L中删除一个最小值节点的高效算法(假设最小值节点是唯一的)

算法图解:

Snipaste_2022-02-25_09-29-07.png

算法思想:

分析:1.找(两个指针) 2.删(两个指针)

思想:指针p遍历列表;pre指向p的前驱;minp标记最小值的结点,minpre指向minp的前驱。

扫描过程中,若p->datadata,则将p,pre分别赋值给minp,minpre。

扫描完毕minp指向最小值结点,minpre指向最小值结点前驱,将minp结点删除即可。

完整代码:

LinkList Delete_min(ListList &L){
    //初始化指针
    LNode *pre = L;
    LNode *p = pre->next;    //指向头结点的下一个结点
    LNode *minpre = pre;     //min初始化
    LNode *minp = p;    //初始化前驱
     while(p != null){
        //查找
        if(p ->data < minp -> data){
            minp = p;
            minpre = pre;
        }else{
            pre = p;
            p = p -> next;
        }
     }
        //删除
        minpre -> next = minp -> next;
        free(minp);
        return L;
}