题目要求
判断链表中是否有环。若有环,将环起始位置读入 pos ,否则 pos 为 -1
示例:
输入:head = [3,2,0,-4],pos = 1
输出:true
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
解题思路
方法一:
给定快指针和慢指针 fast、low,fast 走两步,low 走一步,若相遇,则有环,fast 指向空时,证明无环
(快指针也可以前进 3、4.等其他步数,但一般情况下,前进 2 步,不会出现反超情况)
方法二:
偶然间看到别人的做法,也很巧妙,如下:
遍历链表,每遍历一个数(如:cur),使 cur -.> next = cur -.> prev ,则若有环,遍历完一次环后,必定回到头节点,否则遍历到链表尾部(不得不说,感觉比双指针法好)
解题演示
输入:1->2->2->3->4->4->5
输出:1->3->5
过程显示:
方法一:
- 给定 fast、low 指针
若 fast 走 2(n)步,low 走 1 步,则 fast 与 low 的相对位移为 1(n - 1)步,若有环,则 fast
必会有追上 low 的过程,由于 low 相较于 fast 只慢了一步,所以当 fast、low 进入环后,fast
第一次反超前一定会相遇 - 若 fast = low 则返回 true, 若 fast 指向 NULL,则返回 false
解题代码
bool hasCycle(struct ListNode* head) {
struct ListNode* fast, *low;
if (head == NULL || head->next == NULL)
return false;
low = head->next; fast = head->next->next;
while (fast && fast->next)
{
if (low == fast)
return true;
low = low->next;
fast = fast->next->next;
}
return false;
}