考研数据结构(每日一题)
题目:试编写带头节点的单链表L中删除一个最小值节点的高效算法(假设最小值节点是唯一的)
算法图解:
算法思想:
分析: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;
}