⭐️ 题目描述
设有节点值均为正整数的,带头结点的单链表,设计一算法,反复找出单链表中节点值最小的结点并输出,然后将该结点从中删除,直到链表空位置,再删除头结点。
1️⃣ 代码:
void DeleteMinValue(SingleList * phead) {
// 还有结点 没有删除完 继续循环
while (phead->next != NULL) {
// 第一个结点默认是最小的
SingleList* minNode = phead->next;
// 最小的结点的前一个结点
SingleList* minNodePrev = phead;
// 从第二个结点依次遍历链表
SingleList* cur = phead->next;
/*
用 cur 的下一个结点的 data 来和 minNode的data 比较
这样当 cur->next->data < minNode->data
那么 cur 就是比 minNode结点还小值结点的前一个结点
*/
while (cur->next != NULL) {
if ( cur->next->data < minNode->data ) {
// 记录minNode结点的前一个结点
minNodePrev = cur;
// 最小值结点
minNode = cur->next;
}
// 迭代
cur = cur->next;
}
// 最小值的前一个结点 指向 最小值结点的下一个结点
minNodePrev->next = minNode->next;
// 打印最小值
printf("%d " , minNode->data);
// 删除最小值结点
free(minNode);
}
// 直到链表一个结点没有 删除哨兵尾结点
free(phead);
}