第一次尝试
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 NULL。表为无头结点、单向。(由于涉及到结构体,所以写不了完整的测试代码,下面展示的代码为LeetCode中写的代码)(LeetCode链接)
- 方法一:图文解释:
- 方法二:当然,这个方法有点不好想,我们还可以这样做:(这里就不演示了)
struct ListNode* detectCycle(struct ListNode* head) {
if(head == NULL){
return false;
}
struct ListNode* fast = head;
struct ListNode* slow = head;
//快慢指针法,循环遍历找相遇点
while(fast&&fast->next){
fast = fast->next->next;
slow = slow->next;
if(slow == fast){
break;
}
}
//如果链表无环,那么就不会进入下面的循环中,而是指直接返回NULL
//有环就从头结点和相遇点开始遍历,直到二者相遇,返回交点
while(fast&&fast->next){
if(fast == head){
return fast;
}
fast = fast->next;
head = head->next;
}
return NULL;
}