【面试题】判断单链表是否有环

 

题目:如何在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 };

 

posted @ 2016-04-05 10:20  puyangsky  阅读(510)  评论(0编辑  收藏  举报