环路检测
实例要求
- 1、给定一个链表,如果它是有环链表,实现一个算法
返回环路的开头节点
; - 2、若环
不存在
,请返回NULL
; - 3、如果链表中有某个节点,可以通过
连续跟踪 next 指针
再次到达,则链表中存在环
; - 4、为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(
索引从 0 开始
); - 5、如果
pos 是 -1
,则在该链表中没有环
; - 6、注意:
pos 不作为参数进行传递,仅仅是为了标识链表的实际情况
;
实例分析
- 1、定义快慢指针;
- 2、快慢指针找到相遇点;
- 3、如果快指针到达链表尾部,说明无环;
- 4、将快指针重新指向链表头部,并与慢指针以相同速度移动,相遇点即为环的起点;
- 5、根据函数类型,返回快指针即可;
示例代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode *detectCycle(struct ListNode *head) {
if (head == NULL || head->next == NULL) {
return NULL;
}
struct ListNode *slow = head;
struct ListNode *fast = head;
// 快慢指针找到相遇点
while (fast && fast->next) {
slow = slow->next;
fast = fast->next->next;
if (slow == fast) {
break;
}
}
// 如果快指针到达链表尾部,说明无环
if (fast == NULL || fast->next == NULL) {
return NULL;
}
// 将快指针重新指向链表头部,并与慢指针以相同速度移动,相遇点即为环的起点
fast = head;
while (fast != slow) {
fast = fast->next;
slow = slow->next;
}
return fast;
}
运行结果