带头节点的链表,删除最小/大x元素(唯一)
遍历一趟确定最小/最大值+删除逻辑
void delete(Linklist &L)
{
Lnode *min = L->next; // 默认第一个元素为最小值
Lnode *p = L->next->next; // 该指针指向第2个结点,用于遍历
while (p != NULL) // 循环体
{
if (p->data <= min->data) // 判断是否更新最小值,
{
min = p;
}
p = p->next;
}
//此时 L-5-7-1-8-2-NULL 指针min指向最小值1,
min->data = min->next->data; // 让最小值的data赋值为后一个元素的data
// 此时L变成L-5-7-8.-8-2-NULL
min->next = min->next->next; // 删除操作
// 此时L变成L-5-7-8.-8-2-NULL
// \___/
free(min->next);//释放最小值下一个结点
// 此时L-5-7-8.-2-NULL
return 0;
}
时间复杂度为O(n).
本人觉得通过多指针记录前驱再删除得方式太啰嗦,翻书偶得,故在此记录。