一:解题思路
这道题目有2种解题方法。
第一种:循环遍历单链表中的每个节点,将每个节点加入一个集合set中去,如果遍历的节点在集合set中出现过,这说明这个单链表一定有环。
第二种:用快慢指针法来解决这个问题。定义快指针和慢指针都指向链表的头部,快指针每次走2步,慢指针每次走1步,如果链表有环,进入环内。这就变成了一个追击问题,我们知道快指针一定能够追上慢指针。
二:完整代码示例 (C++版和Java版)
第一种方法C++:
class Solution { public: bool hasCycle(ListNode *head) { set<ListNode*> set; for (ListNode* p = head; p != NULL; p = p->next) { if (set.count(p) != 0) return true; set.insert(p); } return false; } };
第一种方法Java:
public class Solution { public boolean hasCycle(ListNode head) { HashSet<ListNode> set=new HashSet<>(); for(ListNode p=head;p!=null;p=p.next) { if(set.contains(p)) return true; set.add(p); } return false; } }
第二种方法C++:
class Solution { public: bool hasCycle(ListNode *head) { ListNode* fast = head; ListNode* slow = head; while ((fast != NULL) && (fast->next != NULL)) { fast = fast->next->next; slow = slow->next; if (fast == slow) return true; } return false; } };
第二种方法Java:
public class Solution { public boolean hasCycle(ListNode head) { ListNode fast=head; ListNode slow=head; while((fast!=null)&&(fast.next!=null)) { fast=fast.next.next; slow=slow.next; if(fast==slow) return true; } return false; } }