题目:
编写在带头节点的单链表L中删除最小值节点的算法,假设最小值节点只有一个。
思路:
用p从头至尾扫描单链表,pre指向p结点的前驱,用minp保存值最小的结点指针(初值为p),minpre指向*minp结点的前驱(初值为pre)。一边扫描,一边比较,若p->data小于minp->data,则将p、pre分别赋值给minp、minpre,如下图所示。当p扫描完毕时,minp指向最小值结点,minpre指向最小值结点的前驱结点,再将minp所指结点删除即可。
代码:
LinkList DeleteMin(LinkList &L) {
LNode*pre=L,*p=pre->next; //p为工作指针,pre指向其前驱
LNode *minpre=pre,*minp=p; //保存最小值结点及其前驱
while(p!=NULL){
if (p->data<minp->data){ //找到比之前找到的最小值结点更小的结点
minp=p;
minpre=pre;
}
pre=p;
p=p->next;//继续扫描下一个结点
}
minpre->next=minp->next;
free (minp); //删除最小值结点
return L;
}
考察内容:
单链表