假定用带头结点的单链表保存单词,当两个单词有相同的后缀时,则可共享相同的后缀存储空间,例如,“loading”和“being”的存储映像如下图所示。
设str1和str2分别指向两个单词所在单链表的头结点,链表结点结构为,请设计一个时间上尽可能高效的算法,找出由str1和str2所指向两个链表共同后缀的起始位置 (如图中字符i所在结点的位置p)。要求:
1)给出算法的基本设计思想。
2)根据设计思想,用C或C++或Java语言描述算法,关键之处给出注释。
3)说明你所设计算法的时间复杂度。
本题的结构体是单链表,用双指针法。用指针p、q分别扫描strl和str2,当p、q指向同一个地址时,即找到共同后缀的起始位置。
1)算法的基本设计思想如下:
2)本题代码如下:
- typedef struct Node{
- char data;
- struct Node *next;
- }SNode;
- /*求链表长度的函数*/
- int listlen(SNode *head){
- int len=0;
- while(head->next!=NULL){
- len++;
- head=head->next;
- }
- return len;
- }
- /*找出共同后缀的起始地址*/
- SNode* find_addr(SNode *strl,SNode *str2){
- int m,n;
- SNode *p, *q;
- m=listlen (strl) ; //求 strl 的长度
- n=listlen (str2) ; //求 str2 的长度
- for (p=str1;m>n;m--) //若m>n,使p指向链表中的第m-n+1个结点
- p=p->next;
- for (q=str2;m<n;n--) //若m<n,使q指向链表中的第n-m+l个结点
- q=q->next;
- while (p->next !=NULL && p->next!=q->next) {
- //将指针 p 和 q 同步向后移动
- p=p->next;
- q=q->next;
- }//while
- return p->next; //返回共同后缀的起始地址
- }