day27
假定带有头结点的单链表保存有两个单词,设str1,str2分别指向头节点,设计一个时间上尽可能高效的算法,找出由str1和str2所指向两个链表共同后缀的起始位置。
题目分析图
类似于寻找公共结点day14
这里采用最为基础的设计分析方式,即采用暴力法和间距的寻找方式进行设计。基于已经阅读过前面的文章,这里我们直接给出完整代码(看完之前的文章,这道题目很简单了就)
强调一点
题目的要求中因为要对时间尽可能的高效,所以选择编写代码的时候要考虑时间复杂度的问题,
一般来讲,时间尽可能更高效的实现方式有:
只遍历一次链表
用空间来换时间—开辟一个新的数组或其他的数据结构
//设置结构体
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
//获取头节点的单链表的长度函数
int GetLength(LNode*head){
LNode*p=head->next;
int len=0;
while(p!=NULL){
len++;
p=p->next;
}
return len;
}
//主函数
LNode*GetCommondata(Linklist&str1,Linklist&str2){
//求出链表长度
int str1_length=GetLength(str1);
int str2_length=GetLength(str2);
LNode *p,*q;
int k=0;//定义差值
//对比链表长度//核心代码
if(A_length>B_length){
k=A_length-B_length;
p=A->next;
q=B->next;
}else{
k = B_length - A_length;
p = B->next;
q = A->next;
}
//对长链表的起始节点的位置进行调正
while(k--){
p = p->next;}
//核心代码进行比较
while(p != null){
if(p == q){
return p;
}else{
p = p->next;
q = q->next;//当前的不是最后的节点,进行后移
}
}
return null;//以上都没有找到
}
day28
算法思想
时间复杂度高效==用空间换时间
1.先开辟一个一维数组
2.对其中扫描到的数据进行记录
3.记录方式为遍历的data域的数值为多少 就在一维数组相应的下标处所对应的数值置1
4.后期若再扫描到该绝对值相等的结点 直接进行删除
//设置结构体
typedef struct LNode{
ElemType data;
struct LNode *link;
}LNode, *LinkList;
void Find_Delete_SameLNode(LinkList &head,int n){
//初始化准备结点
LNode*p=head->next;
LNode*pre=head;
//开辟数组
C=(int)malloc(sizeof(int*))(n+1);//需要开辟n+1个空间
//初始化数组元素为0
for(int i=0;i<n+1;i++){
C.data[i]=0;
}
//开始循环单链表
while(p!=NULL){
C[abs(p->data)]==0;//取绝对值
if(C.data[p]==0){//说明该位置处的数值还未被访问
//先置1
C.data[p]=1;
//往后遍历
pre=p;
p=p->next;
}else{//若访问的结点之前已经访问过,
//执行删除
//前驱节点的next指向当前删除节点的next
pre->next=p->next;
free(p);
p=pre->next;/重置p的指向结点,应该在删除的结点下一个结点继续进行遍历
}
}
free(C);//最后释放全部结点
}
链表结束。。真的麻了