首页 > 其他分享 >在递增的链表中删除min到max之间的所有元素

在递增的链表中删除min到max之间的所有元素

时间:2022-09-25 11:34:39浏览次数:54  
标签:结点 首元 min max next 链表 data

在递增的链表中删除min到max之间的所有元素

存在一个递增的链表,其中相邻两个结点的数据域的值要么相等,要么就是后面的大于前面的,对该表进行删除 值属于(min,max)包括min和max的结点。

1.算法思想

  1. 判断表是否为空,如果为空则不能删除

  2. 如果首元结点大于max,则无法删除

  3. 首元结点p大于min且小于max,则释放首元结点,让头指针指向该结点的next,如果尾结点的data域值也是符合条件的,则在释放该结点之后,让头指针为空。

  4. 首元结点p小于min,创建一个q=p->next,通过比较q的data域和min比较,如果小于min,则让p q都分别指向自己的后继结点。利用循环找到q.data(>=min)。如果一直比较到q为尾结点,仍然找不到则该表的所有值都小于min,无法进行删除操作

  5. 找到了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

相关文章