环形链表
题目:
思路:
首先我们必须清楚环形链表的定义,环形链表的定义是最后一个结点不再指向空,而是前面任意一个结点,使得链表形成一个环,对环形链表而言,任何一个结点都不会指向空。
方法一:
由定义我们很容易想到环形链表就是两个结点中的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;
}