快慢指针

快慢指针

定义:快慢指针中的快慢指的是移动的步长,即每次向前移动速度的快慢。例如可以让快指针每次沿链表向前移动2,慢指针每次向前移动1次。

应用:1、判断单链表是否为循环链表

           2、在有序链表中寻找中间元素

下面我们分别来看这两种情况:

1、A指针走一步,B指针走两步,A=B时,该链表为循环链表

初始化为:

等走到A=B时,A和B都走了三步,但A经过三个结点,B经过六个结点

根据这个过程,我们来看一下代码:

void if_CircleLinkList(LinkLIst *L){
	Node *A=L;//快指针
	Node *B=L;//慢指针
	A=A->next->next;//一次走两步
	B=B->next;//一次走一步
	while(1){
		if(A==NULL||A->next==NULL){//以NULL结尾不是循环链表
			return false;
		}else if(A==B||A->next==B){//链表中结点个数奇偶不确定
			return true;
		}else{
			A=A->next->next;
			B=B->next;
		}
	}
}

2、在一个位置长度的链表里,如何获取它的中间元素?

假设我们初始化了四个元素,通过快慢指针来查找一下中位数。

根据下列代码,我们来挪动指针试试:

void findMid(LinkLIst *L){//结构体指针
	Node *A=L;//慢指针
	Node *B=L;//快指针
	while(1){
		if(B->next==NULL){//B是最后一个结点或链表为空
			break;
		}else if(B->next->next==NULL){//B是倒数第二个元素(元素个数为奇数)
			A=A->Next;
			break;
		}
		B=B->next->next;
		A=A->next;
	}
	printf("%d",A->data);
}

此时,2和3为中间元素,如果求中位数的话,可以选择返回两个数的和的一半,我们找的是中间元素,可以返回2和3。而如果我们有五个元素的话,

3就是该链表的中间元素。

注意:在求中位数时,要看 算结点个数的时候有没有加头结点,我们这种方法没有加头结点。

 

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 一张图晒出你司的标语 #
4356次浏览 77人参与
# AI面会问哪些问题? #
28127次浏览 565人参与
# 米连集团26产品管培生项目 #
13382次浏览 285人参与
# 你的实习产出是真实的还是包装的? #
20302次浏览 343人参与
# 找AI工作可以去哪些公司? #
9269次浏览 246人参与
# 春招至今,你的战绩如何? #
65914次浏览 584人参与
# 开放七大实习专项,百度暑期实习值得冲吗 #
15330次浏览 223人参与
# 从事AI岗需要掌握哪些技术栈? #
9098次浏览 319人参与
# 中国电信笔试 #
32033次浏览 293人参与
# 你做过最难的笔试是哪家公司 #
34008次浏览 244人参与
# 投递几十家公司,到现在0offer,大家都一样吗 #
340927次浏览 2175人参与
# 哪些公司真双非友好? #
69672次浏览 289人参与
# 阿里笔试 #
178839次浏览 1317人参与
# 机械人避雷的岗位/公司 #
62708次浏览 393人参与
# 小马智行求职进展汇总 #
25139次浏览 80人参与
# 第一份工作一定要去大厂吗 #
14817次浏览 122人参与
# 金三银四,你的春招进行到哪个阶段了? #
22158次浏览 280人参与
# 为了减少AI幻觉,你注入过哪些设定? #
26269次浏览 310人参与
# 应届生第一份工资要多少合适 #
20692次浏览 86人参与
# 沪漂/北漂你觉得哪个更苦? #
9990次浏览 194人参与
# 聊聊你的职场新体验 #
336545次浏览 1895人参与
# HR最不可信的一句话是__ #
6325次浏览 114人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务