java数据结构与算法之链表找环入口

java数据结构与算法之链表找环入口

方法一:使用hash表的方式
  • 首先先遍历这个链表节点,遍历的同时将该节点放入到hashset集合中去。
  • 遍历每个节点的同时去set集合里看看该节点是否存在,如果存在则存在环,并且该节点就是环的入口节点。
public static SingleNode hasCycle2(final SingleNode head) {
  if (head == null || head.next == null) {
   	return null;
  }
  final HashSet<SingleNode> hashSet = new HashSet<>();
  SingleNode current = head;
  while (current != null) {
     // 一边遍历链表一边判断该节点是否在set集合中,如果在则说明有环,并且该节点就是环的入口节点
     // 如果不在并且链表已经遍历完了,则说明没环
     if (hashSet.contains(current)) {
       return current;
     }
     hashSet.add(current);
     current = current.next;
  }
  return null;
}
方法二:使用快慢指针来解决

判断单链表是否有环:

  • 快慢指针都从头节点开始,快指针一次走两步,慢指针一次走一步,当快指针走到的节点为空或快指针的next节点为空则说明该链表无环。
  • 若快指针和慢指针相遇了,则说明该单向链表有环。

如何找到入环节点呢?

  • 当快慢指针相遇了,此时再将快指针指到链表头节点
  • 快慢指针重新开始走,快指针每次走一步,慢指针每次走一步,直到快慢指针再次相遇,相遇的节点就是该单链表的入环节点(可自己去证明)。
public static SingleNode singleListFindCycleNode(final SingleNode head) {
        if (head == null || head.next == null) {
            return null;
        }
        // 两个指针同时从头开始走
        SingleNode fast = head;
        SingleNode slow = head;

        while (fast != null && fast.next != null) {
            // 慢指针一次走一步
            slow = slow.next;
            // 快指针一次走两步
            fast = fast.next.next;
            if (slow == fast) {
                break;
            }
        }

        if (fast == null || fast.next == null) {
            return null;
        }

        // 快指针从头开始重新走,直到他们相遇的节点就是环的入口节点(可自己证明)
        fast = head;
        while (fast != slow) {
            fast = fast.next;
            slow = slow.next;
        }
  			// 返回入环节点
        return fast;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值