题目描述
给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是
-1,则在该链表中没有环。
示例 1:输入:head = [3,2,0,-4], pos = 1 输出:true 解释:链表中有一个环,其尾部连接到第二个节点。
思路:
1.首先想到的是使用set存储的每个元素在链表的位置,遍历之后查找set即可。
2.学习其他人的思路,使用“龟兔赛跑”两个指针来进行查找,如果慢的能追到快的,说明有环,追不到说明闭环。
代码
public boolean hasCycle(ListNode head) {
HashSet set = new HashSet();
while(head != null) {
if(set.contains(head)) {
return true;
}
set.add(head);
head = head.next;
}
return false;
}
修改后的代码
public boolean hasCycle(ListNode head) {
ListNode fast = head;
ListNode slow = head;
//如果有环满指针肯定能追到快指针,如果无环,循环一次结束
while(fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
if(slow == fast) {
return true;
}
}
return false;
}
总结
拿到题目之后先不着急写,理清楚思路之后看能否优化,最终写出来再和前辈们比较, 看自己差在什么地方,理解他们得思路。继续加油!努力!