版权声明:作者:weizu_cool https://blog.csdn.net/qq_26460841/article/details/83243549
题目17:判断B是否是A的连续子列
这里题目的复杂性在于:
链表不一定是有序排列的,其子列完全可以是无序状态下的子列。
思想:首个元素开始两两比较,如果不等,B回退到首个元素,A回退到第二个元素,依次进行下去…… 直到B的链尾,表示匹配成功。不难发现,类似于字符串的简单匹配算法。
bool subSequence(Node *a, Node *b){
//b∈a
a = a->next;
Node *pb = b->next;
Node *p = a;
while(a!=NULL and pb!=NULL){
if(a->num!=pb->num){
p = p->next; //移到下一个比较开始的位置
a = p; //重新设置开始比较的节点
pb = b->next; //重新设置开始比较的节点
}else{
a=a->next; //相等,就全部整体移动
pb=pb->next;
}
}
if(pb==NULL)
return true;
else return false;
}
题目18:判断链表中字符是否中心对称,如xyx
算法思想:
使用栈来判断链表中的数据是否中心对称。
将链表中前一半元素依次进栈,在处理链表的后一半元素时,当访问到链表的一个元素后,就从栈中弹出一个元素,两个元素比较,若相等,则继续直到链表尾部。否则为非中心对称。
值得注意的是,长度是奇数时,中间节点不用比较。
bool isSemetery(Node *a){
int len = getListLength(a, true);
int mid = len / 2;
Node *p = a->next;
char s[mid]; //字符栈 ,采用数组栈,更贴切
int i=0;
for(;i<mid;i++){
s[i] = p->num;
p = p->next;
}
i--; //恢复最后的i值
if(len%2==1) //如果是奇数,跳过中心节点
p = p->next;
while(p!=NULL and s[i]==p->num){
i--; //这里就相当于退栈(栈顶指针的退栈)
p=p->next;
}
if(i==-1) /**栈为空判断, 因为上面的while循环中,i如果是最后一个元素,
退出后i=-1,刚好满足栈的初始定义 **/
return true;
else return false;
}
作者:无涯明月
发文时间:2018-10-21