算法学习-BM6:判断链表中是否有环

算法学习

BM6 判断链表中是否有环

https://www.nowcoder.com/practice/650474f313294468a4ded3ce0f7898b9?tpId=295&sfm=html&channel=nowcoder

题目描述:判断给定的链表中是否有环。如果有环则返回true,否则返回false。
思路:

快慢指针:普通线形链表末尾一定有NULL,链表中是否有NULL判断是不是有环。环形链表遍历过程中会不断循环,线形链表遍历到NULL结束了,但是环形链表何时能结束呢?可以用一种双指针技巧。
1.设置快慢两个指针,初始都指向链表头。
2.遍历链表,快指针每次走两步,慢指针每次走一步。
3.如果快指针到了链表末尾,说明没有环,因为它每次走两步,所以要验证连续两步是否为NULL。
4.如果链表有环,那快慢双指针会在环内循环,因为快指针每次走两步,因此快指针会在环内追到慢指针,二者相遇就代表有环。

代码实现:
#include <iostream>

struct ListNode {
   int val;
     ListNode *next;
     ListNode(int x) : val(x), next(NULL) {}
};
 
class Solution {
public:
	bool hasCycle(ListNode *head) {
		if (head == NULL) //判断是否为空链表
			return false;
		ListNode *fast = head; //快慢指针 (初始为头指针)
		ListNode *slow = head; 
		while (fast != NULL && fast->next!=NULL) //若没环,快指针先到末尾
		{
			fast = fast->next->next; //快指针移动两步
			slow = slow->next;  //慢指针移动一步
			if (fast == slow)  //快慢相遇有环
				return true;
		}
		return false; //到末尾没环
	}
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值