
思路一:哈希表
利用哈希表判断节点是否一样,因为把head存进哈希表的时候,会对应一个唯一的key值,遍历链表的时候只需要对比key值是否存在于哈希表中即可判断是否为环形链表。
时间复杂度:O(n)
空间复杂度:O(n)
- 代码:
public class Solution {
public boolean hasCycle(ListNode head) {
if(head == null){
return false;
}
Set<ListNode> nodes = new HashSet<>();
while(head != null){
if(nodes.contains(head)){
return true;
}else{
nodes.add(head);
}
head = head.next;
}
return false;
}
}
思路二:快慢双指针
定义快慢两个指针,如果链表没有环形结构,那么最快的指针就会最先到达尾部,完成遍历,如果有环形结构,那么快指针肯定会追上慢指针,当两个指针重合时即可判断其含有环形结构
- 代码:
public class Solution {
public boolean hasCycle(ListNode head) {
if(head == null){
return false;
}
ListNode slow = head;
ListNode quick = head.next;
while(slow != quick){
if(quick == null || quick.next == null){
return false;
}
quick = quick.next.next;
slow = slow.next;
}
return true;
}
}
网友评论