1. 程式人生 > >鏈表 | 判斷鏈表B是否為鏈表A的連續子序列

鏈表 | 判斷鏈表B是否為鏈表A的連續子序列

link 空指針 sub int isp b- put puts post

王道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空指針判斷。

鏈表 | 判斷鏈表B是否為鏈表A的連續子序列