本题我们仍然用快慢指针思想去解决:
一、首先判断是否为环形链表{
此题我们用快慢指针思想去解决
①首先我们创建两个指针,一个快的(一次走两步),一个慢的(一次走一步)
②如果说我们是个环形链表的话,那么我们两个指针肯定会相遇的,就是指向同一个地址。
③如果快的指针指向了空地址,那么就意味着不是环形链表
}
二、若为环形链表,我们来确定环开始的位置{
①通过第一步我们确定了它为环形链表,
①这里两个快慢指针第一次相遇后,在结点7的位置,此时将我们的慢指针重新指向头节点2,
②此时我们快慢指针距离环头节点距离相同 都为3
③让我们的快慢指针都走一步,直到相遇,就是我们的环的头节点
④找到后我们对环的头节点位置输出即可
}
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode *detectCycle(struct ListNode *head) {
if(head == NULL) return NULL;
struct ListNode *p=head,*pr=head->next;
while(p != pr && pr && pr->next){//pr->next为了判断快指针所指的下一个是否为空,
//如果不判断,运行可能会报错空指针问题
p = p->next;
pr = pr->next->next;
}
if(pr==NULL || pr->next == NULL) return NULL;//以上是判断是否为环链表
p = head->next;
pr = head->next->next;
while(p != pr){//通过快慢指针思想,去让两个指针第一次相遇
p = p->next;
pr = pr->next->next;
}
p = head;//将慢指针重新指向头节点
while(p != pr){//当两个指针第二次相遇时,就是我们的环链表的开始位置
p = p->next;
pr= pr->next;
}
return p;
}