题目:试编写在带头结点的单链表中删除(一个)最小值结点的(高效)算法。void delete (Linklist &L)。
提示:假设第一个结点就是最小的,要高效,只能遍历一次,单链表中删除结点,必须知道待删除的最小结点的前一个结点,才能用前一个结点删掉它后一个结点,所以要定义一个指针。首先,本身就有一个头结点,假设有p,q,pre,p作为工作指针,q作为最小值的结点的指向,pre指向最小结点的前驱结点。
void Delete (LinkList L){
LinkList p=L->next;
LinkList pre=L; // pre指向头结点
LinkList q=p; // 假设第一个结点为最小值的结点
while (p->next!=NULL){
if(p->next->data < q->data){
pre=p;
q=p->next;
}
p=p->next;
}
pre->next=q->next; // 从链表上删除最小值结点
free (q);
}