算法学习
BM6 判断链表中是否有环
https://www.nowcoder.com/practice/650474f313294468a4ded3ce0f7898b9?tpId=295&sfm=html&channel=nowcoder
题目描述:判断给定的链表中是否有环。如果有环则返回true,否则返回false。
思路:
快慢指针:普通线形链表末尾一定有NULL,链表中是否有NULL判断是不是有环。环形链表遍历过程中会不断循环,线形链表遍历到NULL结束了,但是环形链表何时能结束呢?可以用一种双指针技巧。
1.设置快慢两个指针,初始都指向链表头。
2.遍历链表,快指针每次走两步,慢指针每次走一步。
3.如果快指针到了链表末尾,说明没有环,因为它每次走两步,所以要验证连续两步是否为NULL。
4.如果链表有环,那快慢双指针会在环内循环,因为快指针每次走两步,因此快指针会在环内追到慢指针,二者相遇就代表有环。
代码实现:
#include <iostream>
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
bool hasCycle(ListNode *head) {
if (head == NULL) //判断是否为空链表
return false;
ListNode *fast = head; //快慢指针 (初始为头指针)
ListNode *slow = head;
while (fast != NULL && fast->next!=NULL) //若没环,快指针先到末尾
{
fast = fast->next->next; //快指针移动两步
slow = slow->next; //慢指针移动一步
if (fast == slow) //快慢相遇有环
return true;
}
return false; //到末尾没环
}
};