嗨,大家好,我是袁厨(因为酷爱做饭,所以自己考取了厨师证)。之前一直看大家写的博客,学到了很多东西。然后最近萌生了自己写的想法,将自己知道的分享给需要的同学。以后每天会为大家分享leetcode精选题目的各种题解和Python, JS, JQ, CSS, PHP, JAVA的一些小Demo。请大家关注我,一起交流学习吧。
题目描述
暴力解法
做题思路
这个方法有点low,但是也是可以AC的,因为长度不会大于10000,所以当我们大于10000时,肯定是存在环的,如果没有大于10000就输出了说明是没有环的。题目代码
public class Solution {
public boolean hasCycle(ListNode head) {
int i = 0;
while(head!=null){
head = head.next;
i++;
if(i>10000){
break;
}
}
if(i>10000){
return true;
}
return false;
}
}
HashSet
做题思路
这个思路就是新建一个HashSet,然后将节点存进去,当每次存新节点时看看HashSet里是否含有该节点了,如果含有则证明有环,如果不含有,且遍历完毕,则证明没有环题目代码
public class Solution {
public boolean hasCycle(ListNode head) {
//创建一个存节点的HashSet表
HashSet<ListNode> list = new HashSet<ListNode>();
while(head!=null){
//判断是否存在
if(list.contains(head)){
return true;
}else{
list.add(head);
head=head.next;
}
}
return false;
}
}
快慢指针
做题思路
这个做题方法是比较巧妙的,总的思路就是,快指针在前面跑,慢指针在后面追,但是快指针的速度比慢指针的快,所以遇到环的时候,快指针和慢指针会同时陷进环里,又因为速度不一样,所以他俩必会相遇。题目代码
public class Solution {
public boolean hasCycle(ListNode head) {
//排除为空和一个节点的情况
if(head == null || head.next == null){
return false;
}
//两个指针的位置
ListNode pro = head.next;
ListNode last = head;
//遍历到最后,这里是需要注意的,当节点长度为2,且没有环的时候需要考虑一下
while( pro != null && pro.next!=null){
pro=pro.next.next;
last=last.next;
if(pro == last){
return true;
}
}
return false;
}
}
总结
同学们我最近有了一个长久的计划,就是把leetcode题目整理出来,由浅入深,由简到繁都整理出来是一个宏大的工程,所以我打算每天整理一到两个经典题目,完成这一个流程我相信肯定会收获巨大的。如果想一起刷题的哥们,我们可以一起在群里打卡,共同进步。
作者:LeetCode
链接:https://leetcode-cn.com/problems/rotate-array/solution/xuan-zhuan-shu-zu-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。