p21 判断单链表是否有环 (leetcode 141)

一:解题思路

这道题目有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;
    }
}

猜你喜欢

转载自www.cnblogs.com/repinkply/p/12469129.html