考察的知识点:遍历链表、修改节点的指针指向;
解答方法分析:
- 首先,判断链表是否为空或者只有一个节点,如果是,则直接返回 false,表示不存在环。
- 初始化两个指针
slow
和fast
,初始时都指向链表的头节点。 - 使用一个 while 循环,判断条件为
fast != nullptr
和fast->next nullptr
,即快指针fast
还能往前移动两个节点。循环的目的是找到链表中的环或到达链表的末尾。 - 在循环中,每次将
slow
指针向前移动一个节点,将fast` 指针向前移动两个节点。这样,快指针的速度是慢指针的两倍。 - 在每次移动后,检
slow
和fast
指向同一个节点,即slow == fast`。如果是,表示存在环,返回 true。 - 如果循环结束后,快指针
fast
到达链表的末尾,即fast == nullptr
或者fast->next == nullptr
,表示链表无,返回 false。
所用编程语言:C++;
完整编程代码:↓
/** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : val(x), next(nullptr) {} * }; */ class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param head ListNode类 * @return bool布尔型 */ bool hasCycle(ListNode* head) { if (head == nullptr || head->next == nullptr) return false; ListNode* slow = head; ListNode* fast = head; while (fast != nullptr && fast->next->next != nullptr) { slow = slow->next; fast = fast->next->next; if (slow->val == fast->val) { return true; } } return false; } };