数据结构代码题day27-30

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);//最后释放全部结点
}

链表结束。。真的麻了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值