LeetCode刻意练习09--环形链表

环形链表

在这里插入图片描述
题目:在这里插入图片描述
思路:
首先我们必须清楚环形链表的定义,环形链表的定义是最后一个结点不再指向空,而是前面任意一个结点,使得链表形成一个环,对环形链表而言,任何一个结点都不会指向空。
方法一:
由定义我们很容易想到环形链表就是两个结点中的next指向同一个结点。所以我们遍历链表,将结点的地址存入一个哈希表,
(1)如果遍历过程中结点的next为空,则说明不是环形链表。
(2)如果遍历过程中,某结点的地址值在哈希表中已经存在,则说明是环形链表

    	HashSet<ListNode> set=new HashSet<ListNode>();
    	while(head!=null)
    	{
    		if(set.contains(head))
    			return true;
    		set.add(head);
    		head=head.next;
    	}
    	return false;

方法二:
方法二是比较巧妙的方法,很难想到。
我们假设两个人在圆形跑道上跑步,如果两个人一个跑得快,一个跑得慢,根据追击问题,两个人最终是会相遇的。
同理,我们假设是一个环形链表,定义两个指针,一个走得快一个走得慢,那么这两个指针一个会相等。
如果两个指针其中一个指向空了。说明不是环形链表。
(注意跳出循环的条件)

 public boolean hasCycle(ListNode head) {
       ListNode slow=head;
    	ListNode fast=head;
    
    	while(slow!=null&&fast!=null&&fast.next!=null)
    	{
        	slow=slow.next;
        	fast=fast.next.next;
        	if(fast==slow)
        		return true;
    	}
    	return false;
        
 
    }
发布了49 篇原创文章 · 获赞 2 · 访问量 888

猜你喜欢

转载自blog.csdn.net/qq_43720551/article/details/104729787