判断链表有没有环

 题目描述:

判断给定的链表中是否有环

扩展:

你能给出不利用额外空间的解法么?

有环的链表:

首先要清楚有环的链表长啥样,看图一,有环的链表有什么特点呢?从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;
    }
发布了52 篇原创文章 · 获赞 6 · 访问量 8994

猜你喜欢

转载自blog.csdn.net/PMPWDF/article/details/104018827