环形链表

 
bool hasCycle(ListNode *head) {
    if (head == nullptr || head->next == nullptr) {
        return false;
    }
    // 快慢指针: 初始为相同节点
    ListNode *slow = head;
    ListNode *fast = head;
    // 判断快指针是否为空即可
    while (fast != nullptr && fast->next != nullptr) {
	      // 先移动快慢指针
        slow = slow->next;
        fast = fast->next->next;
        // 再判断是否相等
        if (slow == fast) {
            return true;
        }
    }
    return false;
}
 

环形链表II

不仅要判断有无环,有环的情况下,还要返回环的入口节点
// 快慢指针是判断有无环,现在还需要返回入口节点
ListNode *detectCycle(ListNode *head) {
    ListNode *slow = head;
    ListNode *fast = head;
    while (fast != nullptr && fast->next != nullptr) {
        slow = slow->next;
        fast = fast->next->next;
        if (slow == fast) {// 碰到相同节点了,说明有环。
            fast = head;
            while (fast != slow) {
                fast = fast->next;
                slow = slow->next;
            }
            return fast;
        }
    }
    return nullptr;
}
你觉得这篇文章怎么样?
YYDS
比心
加油
菜狗
views

Loading Comments...