题目描述:
判断给定的链表中是否有环
扩展:
你能给出不利用额外空间的解法么?
有环的链表:
首先要清楚有环的链表长啥样,看图一,有环的链表有什么特点呢?从head开始遍历,最终会进入环中,在环里循环遍历,并不会出现null。
思路:
1、不考虑额外空间问题,即可以运用其他的结构来解决问题。
可以使用哈希表,每遍历一个node在hashmap中寻找有没有存在该node地址的键,如果有则存在环,没有则将其地址作为键加到haspmap中。
2、考虑额外空间问题。
使用快慢两个指针,fast指针一次走2步,slow指针一次走一步,看图二
如果有环则两个指针最终都会在环中遍历,一定会相遇fast ==slow
如果没有环,则fast或fast.next会先指向null
注意:写代码时小心空指针的问题,还有一开始就要判断链表是不是空。
public class Solution {
public boolean hasCycle(ListNode head) {
if(head == null || head.next == null){
return false;
}
ListNode p1 = head.next;
ListNode p2 = head.next.next;
while(p1 != p2 && p2 != null && p2.next != null){
p1 = p1.next;
p2 = p2.next.next;
}
if(p1 == p2){
return true;
}
else{
return false;
}
}
}
public class Solution {
//nocoder pass
public boolean hasCycle(ListNode head) {
if (head == null) {
return false;
}
ListNode slow = head;
ListNode fast = head;
//仅用判断fast,因为fast快,无环一定比slow先为null
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
if (fast == slow) {
return true;
}
}
return false;
}