题目:如何在O(1)空间复杂度的条件下判断单链表是否有环。
思路:采用快慢指针,如果有环,两指针一定会相遇。
图示:
图1:初始化情况,创建两个指针都指向head节点。
图2:p指针为慢指针,每次只走一步;q指针为快指针,每次走两步。
图3:p、q继续往后走。
图4:p、q继续往后走。
图5:p、q继续往后走。
图6:p、q相遇,程序返回true。
如果p、q相遇,则程序返回true,说明该链表有环;若单链表中没有环,则每次判断q->next和q->next->next是否为nullptr,若满足则说明没有环。当单链表只有一个节点或0个节点,返回False。
代码:
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 bool hasCycle(ListNode *head) { 12 if(head == nullptr || head->next == nullptr) return false; 13 ListNode *p = head, *q = head; 14 while(q->next != nullptr && q->next->next != nullptr) 15 { 16 p = p->next; 17 q = q->next->next; 18 if(p == q) return true; 19 } 20 return false; 21 } 22 };