给你一个链表的头节点 head ,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。
如果链表中存在环 ,则返回 true 。 否则,返回 false 。
class Solution {
public:
bool hasCycle(ListNode* head) {
ListNode *p = head, *q = head;
while (q&&q->next) {
p = p->next;
q = q->next->next;
if (p == q)
return true;
}
return false;
}
};
使用快慢指针的思想,若快指针没能找到链表尾部则说明一定有环结构存在。并且一定存在某时刻快慢指针相遇。
给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
不允许修改 链表。
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
ListNode* p=head,*q=head;
while(q&&q->next){
p=p->next;
q=q->next->next;
if(p==q){
ListNode *t=head;
while(t!=p){
t=t->next;
p=p->next;
}
return t;
}
}
return nullptr;
}
};
本题相较于环形链表原题增加了一点点条件,要求链表成环时返回入环点,我们只需要在双指针相遇时创建一个临时指针指向链表头,并且将其速度设置和慢指针相同,以这个速度可以证明当慢指针继续和临时指针在链表中一同移动时,它们会在入环节点相遇,此时返回临时指针或慢指针即可;若无环结构,则退出while循环并返回一个空指针结束。