BDS之链表经典问题

本文详述了几个关于链表的经典问题,包括寻找倒数第m个元素、判断链表是否有环、链表逆序、寻找环的入口点、判断链表相交、去除重复元素、求交并差集以及约瑟夫环问题。文中提供了多种解题思路和算法,如快慢指针法、逆序操作和使用哈希表优化等。
摘要由CSDN通过智能技术生成

这篇内容我将介绍几个关于链表的经典问题,很多都是来自互联网(相信绝大部分来自于经典书籍),特在本篇中收集和整理(持续更新,欢迎提供链表相关问题)。

以下问题,简单的我都会列出解题的大体思路,复杂点的我会详细的说明。

问题1:给定一个单向链表,设计一个算法,找到该链表的倒数第m个元素,当m=0时,返回链表最后一个元素。

解法一:

要遍历链表两次,第一次遍历链表取得长度n,然后计算要沿链表移动的步数s=n-m(当然这里假设n>m);第二次遍历链表拿到在s处的链表结点元素。

解法二:

要拿到倒数第m个元素,我们可以设计两个指针p1,p2,它们的在链表中的间距为m(这里间距是通过p1,p2相对于头结点的位序计算),同时移动两个指针,当后一个指针p2到链表末尾时,前一个指针p1就是要取的结点。

问题2:判断一个的单向链表是否有环。

解法:

最经典的解法就是快慢指针法,定义指针p,q,在链表中,p每次前进一步,q每次前进两步,如果p能和q重合,那么具有环。可以这么理解,在每次移动的过程中,可以看做p相对q是静止的,q每次移动一步,所以如果有环,那么q总能赶上p的。

下面我们给出上面问题的证明:

假设假设快慢指针的移动速度分别为vp,vq,并且环的长度为l,在某一时刻t,p和q指针距离环的入口结点相距分别为dp,dq,那么,假设在经过m次移动后,p和q指针重合,即有环,那么满足下面的等式:

dp+vp*m mod(l) = dq+vq*m mod(l);

->   (vp-vq)*m mod(l)=dq-dp

可进一步推导出  (vp-vq)*m - p*l = dq-dp  (p为取模的商)

这里假设 A=vp-vq, B=-l,C=dq-dp 

那么等式为 A*m+pB=C ,其中,A,B,C已知。这里对我们的问题来说,要求取一对数(m,p)使得可以取得m为一正整数即可,当然对于算法来说越小越好。其实,这里这个问题就是经典的拓展欧几里问题,即ax+by=c,若c mod gcd(a,b)=0,则一定存在解x,y满足等式。这里,我们证明的前提是vp=1,vq=2,则A=-1,B=-l,C=vp*t-vp*t,显然gcd(A,B)等于1,

则一定满足C mod gcd(a,b) = 0,所以一定存在解m,p使得等式满足,即当我们用步进分别为1和2的指针循环时,如果链表有环就一定会发生碰撞。关于这个拓展欧几里得算法的详细证明,请参考<MAT-欧几里得及拓展欧几里得算法>一篇。

这里我们给出算法的伪代码:

bool has_loop(head)
begin:
	p=head; q=head; 
	while(q&&q->next){
		p=p->next;
		q=q->next->next;
		if(p==q) reuturn true;
	}
	return false;
end;

问题3:将一个单向链表逆序

解法:

算法开始的条件应该至少有两个以上的结点数,需要用到三个指针,分别指向前驱结点,当前结点以及后继结点,操作看下面一组图:

1初始p=head->next; q=head->next->next ; t=NULL;


2.判断q是否到链表尾,如果是,结束循环,否则执行循环体,将t指向q的下个元素,同时将q的下个元素修改为前驱结点p,分别向前移动p,q指针,此时q,t指向同一个结点

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值