题目:给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
示例 1:
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。
示例 2:
输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。
示例 3:
输入:head = [1], pos = -1
输出:false
解释:链表中没有环。
思路一:采用快慢指针法,如果有环的情况下,那么不存在走到NULL的位置上,所以我们可以想象一下在操场上跑步,两人同时起跑不停止,那么跑得快的人必然会在某一时刻追上跑得慢的人~
模拟到链表上,起点相同都是 p = head; q = head; 然后让跑得慢的人一次走一步(p = p->next),跑得快的人一次走两步(q = q->next->next),如果有环,必然存在p和q相等的情况,此时返回true即可; 如果不存在环,那么p和q必然有一个会走到NULL
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
bool hasCycle(ListNode *head) {
if(head==NULL) //空链表不存在环,直接返回false;
{
return false;
}
ListNode *p=head,*q=head; //快慢指针起点相同;
while(p->next!=NULL&&q->next!=NULL)
{
p=p->next;q=q->next->next; //p走一步,q走两步;
if(p==q)
{
return true;
}
if(p==NULL||q==NULL) //不存在环,所以会走到NULL,返回false;
{
return false;
}
}
return false;
}
};
本文介绍了一种使用快慢指针法检测链表中是否存在环的有效方法。通过实例演示了当链表尾部连接到不同节点时,如何判断链表是否形成环状结构。这种方法在计算机科学的数据结构和算法中具有广泛应用。
1453

被折叠的 条评论
为什么被折叠?



