zoukankan      html  css  js  c++  java
  • 链表 | 判断链表B是否为链表A的连续子序列

    王道P38T16

    代码:

    bool common_subSequence(LinkList &A,LinkList &B){
        LNode *pA,*pB=B->next,*p=A->next;
        while(p!=NULL){
            if(p==NULL || pB==NULL) return false;
            if(p->data == pB->data){
                pA=p;
                while(pA!=NULL && pB!=NULL){
                    if(pA->data != pB->data){
                        break;
                    }
                    pA=pA->next;
                    pB=pB->next;
                }
                if(pB==NULL)
                    return true;
                pB=B->next;
            }
            p=p->next;
        }
        return false;
    } 

    主代码:

    #include <cstdio>
    #include <stdlib.h>
    
    using namespace std;
    
    typedef struct LNode{
        int data;
        struct LNode* next=NULL; 
        LNode(int x=0){    
            data=x;
        }
    }LNode;
    
    typedef LNode* LinkList;
    
    LinkList  build_list(int * arr,int n){
        int i;
        LinkList L=new LNode;
        LinkList pre=L;
        for(i=0;i<n;i++){
            LinkList p=new LNode(arr[i]);
            pre->next=p;
            pre=p;
        }
        return L;
    }
    
    void show_list(LinkList& L){
        LinkList p=L->next;
        while(p){
            printf("%d ",p->data);
            p=p->next;
        }
        puts("");
    }
    
    bool common_subSequence(LinkList &A,LinkList &B){
        LNode *pA,*pB=B->next,*p=A->next;
        while(p!=NULL){
            if(p==NULL || pB==NULL) return false;
            if(p->data == pB->data){
                pA=p;
                while(pA!=NULL && pB!=NULL){
                    if(pA->data != pB->data){
                        break;
                    }
                    pA=pA->next;
                    pB=pB->next;
                }
                if(pB==NULL)
                    return true;
                pB=B->next;
            }
            p=p->next;
        }
        return false;
    } 
    
    int main(){
        int A_arr[5]={0,0,2,2,2};
        int B_arr[3]={2,2,2};
        LinkList A=build_list(A_arr,5);
        LinkList B=build_list(B_arr,3);
        puts(common_subSequence(A,B)?"Yes":"No");
    }
     
    View Code

    注意:

    注意紫色代码处的工作指针p的滑动和橙色代码处的pB空指针判断。

  • 相关阅读:
    如何判断轮廓是否为圆(算法更新)
    近期购置的CV&AI类图书梳理
    基于OpenCV实现“钢管计数”算法,基于Csharp编写界面,并实现算法融合
    大厂们的 redis 集群方案
    redis 突然大量逐出导致读写请求block
    Docker 1.13 管理命令
    玩转 Ceph 的正确姿势
    Docker 常用命令
    git常用命令
    从C++到GO
  • 原文地址:https://www.cnblogs.com/TQCAI/p/8452056.html
Copyright © 2011-2022 走看看