- 判断是否有环
使用快慢指针, 分别定义 fast 和 slow指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环。
2.找环的入口节点
从头结点出发一个指针,从相遇节点 也出发一个指针,这两个指针每次只走一个节点, 那么当这两个指针相遇的时候就是 环形入口的节点。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution
{
public:
ListNode *detectCycle(ListNode *head)
{
if(head == nullptr || head->next == nullptr)//特殊条件判定 头指针为空
{
return nullptr;
}
ListNode* fastNode = head;//快指针
ListNode* slowNode = head;//慢指针
while(fastNode->next != nullptr && fastNode->next->next != nullptr)//注意不能使用! fastNode->next && !fastNode->next->next
{
slowNode = slowNode->next;//慢指针走一步
fastNode = fastNode->next->next;//快指针走两步
if(fastNode == slowNode)//找到环
{
slowNode = head;
while(slowNode != fastNode)//寻找环的入口结点
{
slowNode = slowNode->next;
fastNode = fastNode->next;
}
return slowNode;
}
}
return nullptr;
}
};