美文网首页
环形链表

环形链表

作者: 奉灬孝 | 来源:发表于2021-03-18 00:06 被阅读0次

    快慢指针

    我们定义两个指针,一快一满。慢指针每次只移动一步,而快指针每次移动两步。初始时,慢指针在位置 head,而快指针在位置 head->next。这样一来,如果在移动的过程中,快指针反过来追上慢指针,就说明该链表为环形链表。否则快指针将到达链表尾部,该链表不为环形链表。

    为什么我们要规定初始时慢指针在位置 head,快指针在位置 head->next,而不是两个指针都在位置 head

    观察下面的代码,我们使用的是 while 循环,循环条件先于循环体。由于循环条件一定是判断快慢指针是否重合,如果我们将两个指针初始都置于 head,那么 while 循环就不会执行。因此,我们可以假想一个在 head 之前的虚拟节点,慢指针从虚拟节点移动一步到达 head,快指针从虚拟节点移动两步到达 head->next,这样我们就可以使用 while 循环了。
    当然,我们也可以使用 do-while 循环。此时,我们就可以把快慢指针的初始值都置为 head

    bool hasCycle(struct ListNode* head) {
        if (head == NULL || head->next == NULL) {
            return false;
        }
        struct ListNode* slow = head;
        struct ListNode* fast = head->next;
        while (slow != fast) {
            if (fast == NULL || fast->next == NULL) {
                return false;
            }
            slow = slow->next;
            fast = fast->next->next;
        }
        return true;
    }
    

    相关文章

      网友评论

          本文标题:环形链表

          本文链接:https://www.haomeiwen.com/subject/ydvycltx.html