• 链表的相关算法及应用(二)


    目录:

    问题一:递归删除一个不带头结点的单链表L中的所有值为x的结点 

    问题二:反向输出单链表中节点的值

    问题三 :删除单链表中最小值的节点

    问题四 :删除值介于 a b之间的节点

    问题五 :找出两个链表的公共节点

    //问题一:递归删除一个不带头结点的单链表L中的所有值为x的结点 
    void delX(LinkList &h,elemType x){
        LNode *t;
        if(h==NULL)
            return;
        else if(h->data==x){
            t=h;
            h=h->next;
            free(t);
            delX(h,x);
        }else
            delX(h->next,x);
        
    }
    
    //问题一:方法二 迭代 
    void delX2(LinkList &L,elemType x){
        while(L&&L->data==x)
            L=L->next;
        LNode *pre=L;
        LNode *p=L->next;
        LNode *t;
        while(p){
            while(p&&p->data==x){
                t=p;
                p=p->next;
                free(t);
            }
            pre->next=p;
            pre=p;
            if(p)
                p=p->next;
        }
    }
    //问题二:反向输出单链表中节点的值
    void printReverse(LinkList L){
        if(L->next!=NULL)
            printReverse(L->next);
        printf("%d ",L->data);
    } 
    //问题三 删除单链表中最小值的节点
    void delMin(LinkList &L){
        LNode *pre=L;
        LNode *p=L->next;
        LNode *min = L->next;
        while(p->next){
            if(p->next->data<min->data){
                min = p;
            }
            p=p->next;
        }
        LNode *t=min->next;
        min->next=min->next->next;
        free(t);
    } 
    //问题四 删除值介于 a b之间的节点
    void delBetween(LinkList &L,elemType a,elemType b){
        LNode *pre=L,*p=L->next;
        while(p){
            while(p&&p->data>=a&&p->data<=b)
                p=p->next;
            pre->next=p;
            pre=p;
            if(p)
                p=p->next;
        }
    } 
    //问题五 找出两个链表的公共节点
    LinkList search_common(LinkList L1,LinkList L2){
        int len1=0,len2 = 0;
        LNode *p1=L1->next,*p2 = L2->next;
        while(p1){
            len1++;
            p1=p1->next;
        }
        while(p2){
            len2++;
            p2=p2->next;
        }
        LNode *longList;
        LNode *shortList;
        int dist;
        if(len1>len2){
            longList = L1->next;
            shortList = L2->next;
            dist = len1-len2;
        }else{
            longList = L2->next;
            shortList = L1->next;
            dist = len2-len1;
        }
        while(dist--)
            longList = longList->next;
        while(longList!=shortList){
            longList = longList->next;
            shortList = shortList->next;
        }
        return longList;
        
    }
  • 相关阅读:
    有限元方法的核心思想
    由拉格朗日函数推导守恒定律
    codeforces 1181D
    gym 102222 J
    COJ#10C
    已然逝去の夏日泳装
    NC50 E
    codeforces 1147 C
    agc 037 C
    19牛客多校第十场G
  • 原文地址:https://www.cnblogs.com/hekuiFlye/p/9360038.html
Copyright © 2020-2023  润新知