代码在见文章结尾
链表带环问题是链表中的经典问题,链表带环问题首先得判断链表是否带环,其次可能会有延伸问题,问在哪一个节点进去环。
下面是问题求解:
第一步判断链表是否带环:
1.设置快慢指针slow和fast,慢指针一次走一步,快指针一次走两步,如果两个指针能相遇则说明该链表带环
判断出链表带环后可能还会有延伸问题:
计算出该链表在哪个节点进入环
思路一:需要通过公式证明由于太复杂这里就不写了,可以看比特杭哥的链表OJ题。
思路二:在相遇电断开链表,利用快慢指针求解
//环形链表 判断链表是否为环形链表 如果带环计算出从哪里开始进入环
//思路:快慢指针判断是否带环,慢指针走一步 快指针走两步,如果带环,快慢指针最终会相遇
//计算进入环的节点思路:
//判断是否带环
bool hasCycle(struct ListNode* head)
{
struct ListNode* slow = head;
struct ListNode* fast = head;
while (fast&&fast->next)
{
slow = slow->next;
fast = fast->next->next;
if (slow == fast)
{
return true;
}
}
return false;
}
//延伸问题:求相遇点
struct ListNode* detectCycle(struct ListNode* head)
{
struct ListNode* slow = head, * fast = head;
while (fast && fast->next)
{
slow = slow->next;
fast = fast->next;
if (slow == fast)
{
//相遇
struct ListNode* meet = slow;
while (meet != head)//需要公式证明 太复杂 这里就不写了
{
meet = meet->next;
head = head->next;
}
//说明相遇 找到入口点
return head;
}
}
return NULL;
}