小白算法积累——单链表16#2个不带头结点单链表+判断子序列

题目:两个整数序列A=a1,a2,a3…am和b1,b2,b3。。。bn已经存入两个单链表中,设计一个算法,判断序列B是否为序列A的连续子序列。
关键字:2个不带头结点单链表+判断子序列

思路
B是A的子序列的充分条件:B的所有元素都存在于A中,且排列顺序也相同。
意味着:A中某个元素就是B的开头元素,这里叫她子序列首元素“”
我们需要对每一个A元素进行向后扫描,检查其是否是子序列首元素,考察其是否承担得起以下功能:1.本身值等于B首元素,2.之后所有元素的值和B首元素之后所有元素的值相同

1.确定子序列首元素 ,同时遍历AB,
a.当下A元素不等于B首元素。这个元素一定不是子序列首元素
A向后扫描寻找新机会,B牢牢卡主首元素的位置,直到A找到相同元素,然后再AB同时向后扫描验证B是否为子序列

b.当下A元素等于B首元素。这个元素可能是子序列首元素,利用pre指针在A中保存这个“疑似子序列首元素”

(因为万一之后发现功能2不满足,需要从这个元素的下一个元素开始再次判定是否为“子序列首元素”
eg:A:1,2,5,5,5,10,4
B:5,5,10
可以看到,虽然第一个5不是“子序列首元素”,但第二个5是的,而当你判断到第一个5不是“子序列首元素”时,pa指针已经在第三个5上了,所以我们需要pre来保存“**疑似子序列首元素”**的位置。
之后,需要从pre->next开始,“”判定其是否为“子序列首元素”

两表同时后移指针;

a)、若对应数据相等,则两表同时后移指针;
b)、若对应数据不等,则“疑似子序列首元素”确定不是“子序列首元素。”
A链表从上次开始比较结点的后继,即“疑似子序列首元素的下一个元素”开始,重复上述判断其是否为“子序列首元素的过程。

需要变量:La,Lb,各自工作指针 pa , pb, 记忆开始结点小助手 pre

int Pattern(LinkList La,LinkList Lb){
    LNode*pa=La;
    LNode*pb=Lb;
    LNode*pre=pa;//pre是记住每趟比较中A链表的开始结点,即每一次的“疑似子序列首元素”
    while(pa&&pb)
      if(pa->data==pb->data){
        pa=pa->next;
        pb=pb->next;
        }
      else {
        pre=pre->next;//开始下一个“疑似子序列首元素”的验证过程
        pa=pre;//pa工作指针,从新位置开始遍历
        pb=Lb;//pb需要从首指针开始
        }
    if(pb==NULL)//遍历A的过程没结束之前,B已经结束了,说明A包含了B
       return 1;
   else//A遍历完了的情况下,B还在首位,说明A没有包含B
      return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值