题目考查的知识点
- 本题抽象为链表是否存在环的问题。
- 同时考察快慢指针。
题目解答方法的文字解析
- 当一个链表有环时,快慢指针都会陷入环中进行无限次移动,然后变成了追及问题。
- 想象一下在操场跑步的场景(有环),只要一直跑下去,快的总会追上慢的。
- 当两个指针都进入环后,每轮移动使得慢指针到快指针的距离增加一,同时快指针到慢指针的距离也减少一,只要一直移动下去,快指针总会追上慢指针。
如果将尾结点的 next 指针指向其他任意一个结点,那么链表就存在了一个环。
本题解析所用的编程语言
- c++
完整且正确的编程代码
class Solution { public: bool hasCycle(ListNode* head) { // 初始化快慢指针都为头节点 ListNode* slow = head, * fast = head; // 只要快慢指针还可以继续前进 while (fast != nullptr && fast->next != nullptr) { slow = slow->next;// 慢指针每次前进一个节点 fast = fast->next->next;// 快指针每次前进两个节点 //(while里面的条件保证了不会有空指针的访问) if (fast && slow->val == fast->val)//快慢指针相遇 return true; } return false; } }; /* 2023.08.03 */