在递增的链表中删除min到max之间的所有元素
存在一个递增的链表,其中相邻两个结点的数据域的值要么相等,要么就是后面的大于前面的,对该表进行删除 值属于(min,max)包括min和max的结点。
1.算法思想
-
判断表是否为空,如果为空则不能删除
-
如果首元结点大于max,则无法删除
-
首元结点p大于min且小于max,则释放首元结点,让头指针指向该结点的next,如果尾结点的data域值也是符合条件的,则在释放该结点之后,让头指针为空。
-
首元结点p小于min,创建一个q=p->next,通过比较q的data域和min比较,如果小于min,则让p q都分别指向自己的后继结点。利用循环找到q.data(>=min)。如果一直比较到q为尾结点,仍然找不到则该表的所有值都小于min,无法进行删除操作
-
找到了q.data(>=min)之后,就让p->next指向q->next,释放掉q,再让q指向p->next。如果q为尾结点的同时,q->data仍小于等于max,则再释放掉q之后 让p的next为空,即让p结点成为尾结点。
2.算法设计
bool DelList_minmax(LinkList& L,int min,int max)
{
if (L->next == NULL)
{
printf("链表为空,删除失败\n");
return false;
}
LNode* p=L->next;//此时p为首元结点
LinkList q;
if (p->data > max) //首元结点大于max
{
printf("递增链表的首元结点data域值大于max,删除失败\n");
return false;
}
if (p->data >= min)//首元结点大于min且小于max
{
while (p->data <= max&&p->next!=NULL)
{
L->next = p->next;
free(p);
p = L->next;
}
if (p->next == NULL&&p->data <= max)
{
free(p);
L->next = NULL;
}
return true;
}
else //首元结点小于min
{
q = p->next;
while (q->data < min)
{
if (q->next == NULL)
{
printf("该链表所有元素都小于min,删除失败\n");
return false;
break;
}
p = p->next;
q = q->next;
}
while (q->data <= max&&q->next!=NULL)
{
p->next = q->next;
free(q);
q = p->next;
}
if (q->next == NULL&&q->data <= max)
{
free(q);
p->next = NULL;
}
return true;
}
}
标签:结点,首元,min,max,next,链表,data
From: https://www.cnblogs.com/wlb429/p/16725654.html