编写在带头节点的单链表L中删除一个最小值节点的高效算法(假设该节点唯一)。
思想:从前往后遍历链表,开始时,将第一个节点设置为最小节点,设置最小值节点前驱和移动指针、移动指针前驱。当出现比最小值节点所指的值小时,更新最小值节点,否则往后遍历,知道移动指针为空为止。
代码:
LinkList DeleteMin(LinkList &L){
LNode *pre=L,*p=L->next;//p为工作指针,pre为工作指针前驱
LNode *minpre=pre,*mimp=p;//minp为最小值指针,minpre为最小值指针前驱
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;
}
时间复杂度O(n);空间复杂度O(1)
与删除带头节点单链表中最小值节点类似题目:
给定一个带表头结点的单链表,设head为头指针,结点结构为(data, next),
data为整型元素,next为指针,试写出算法:按递增次序输出单链表中各结点的数据元素,并释放结点所占的存储空间(要求 : 不允许使用数组作为辅助空间)。
思想:找到单链表的最小值,然后进行输出。
代码:
LinkList DeleteMin(LinkList &L){
LNode *pre=L,*p=L->next;//p为工作指针,pre为工作指针前驱
LNode *minpre=pre,*mimp=p;//minp为最小值指针,minpre为最小值指针前驱
while(p!=NULL){
if(p->data<minp->data){//更新最小值
minp=p;
minpre=pre;
}else{//更新工作指针
pre=p;
p=p->next;
}
}
minpre->next=minp->next;//删除最小值
printf("%d,", minp->data);
free(minp);
return L;
}
void DeleteAndPrintMin(LinkList head){
while(head->next != NULL){
daleteMin(head);
}
printf(" ");
}
时间复杂度O(n^2);空间复杂度O(1)