链表有环是什么意思_环形链表问题详解

本文主要解决力扣上与链表相关的两道题目:
141、环形链表
142、环形链表 II

主要关于如何判断链表是否有环以及如何求出有环链表的入环节点。

判断链表是否有环

首先来看第141题,题目给定了一个链表,然后让我们判断这个链表是否有环。那有环和无环的链表长什么样子呢,可以画一下图形来比较一下:

1d28e4f29691a90ab7efd5c51432a200.png
无环链表

无环链表的每个节点通过指针按顺序相连,并且尾节点指向的是空节点。

76982885680f24f67b9b6e50207f01b5.png
有环链表

有环链表与无环链表类似,区别在于尾结点指向了之前的某个节点,从而使链表出现了“环”。

到这里可能会有小伙伴反应过来:那我先创建一个指针,然后指向首节点,之后做一个循环,每次将指针指向当前节点的下一个节点,当当前指向的节点为空时,不就表示这个链表是无环链表了吗,因为这时已经到达了无环链表的尾部,所以它的下一个节点是空的;而有环链表不存在这种情况,因为它的所谓的尾结点会指向之前的某个节点,从而形成一个回路,因此遍历多少次都是不会遇见空节点的。

while(head != null){
     
    head = head.next;
}

很好,到这里已经完成了一半,当遇到无环链表时,有限次遍历之后会出现空指针,那如果遇到有环链表时怎么判断它是有环的呢?

第一种做法是从首节点开始遍历,每次将经过的节点存储在一个集合里面,同时比较当前经过的节点跟集合中的节点的地址是否相同,如果相同的话,就可以判断该链表是有环的,同时这个节点也就是入环节点了。对应的代码如下:

public boolean hasCycle(ListNode head) {
     
    if(head == null){
        return false;
    }

    HashSet set = new HashSet<>();
    set.add(head);while(head.next != null){ if(set.co
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值