判断链表有没有环

 题目描述:

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

扩展:

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

有环的链表:

首先要清楚有环的链表长啥样,看图一,有环的链表有什么特点呢?从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;
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值