主要考察两知识点:
- 判断链表是否环
- 如果有环,如何找到这个环的入口
首先 定义两个指针,快指针,慢指针,如果相遇则有环
第二 在相遇出插入新指针index1,重新定义一个指针index2,同时走,相遇处则为环的入口
struct ListNode *detectCycle(struct ListNode *head) {
struct ListNode *fast = head, *slow = head;
while (fast && fast->next) {
// 这里判断两个指针是否相等,所以移位操作放在前面
slow = slow->next;
fast = fast->next->next;
if (slow == fast) { // 相交,开始找环形入口:分别从头部和从交点出发,找到相遇的点就是环形入口
struct ListNode *f = fast, *h = head;
while (f != h) f = f->next, h = h->next;
return h;
}
}
return NULL;
}