判断一个单链表是否有环,若有环,求进入环中的第一个节点

判断单向链表是否有环,可以采用快指针与慢指针两个指针的方式来解决。即定义一个快指针fast和一个慢指针slow,使得fast每次跳跃两个节点,slow每次跳跃一个节点。如果链表没有环的话,则slow与fast永远不会相遇(这里链表至少有两个节点);如果有环,则fast与slow将会在环中相遇。判断出链表有环以后,则需要算出进入环的第一个节点。在fast与slow第一次相遇后,设置一个节点p从链表的头部开始遍历,每次只遍历一个节点。这样,当fast与slow再次相遇时,p所处的位置便是环的首部。

1.判断一个单链表是否有环.

Public static boolean hasCycle(listNode head) {

    boolean flag = false;
    ListNode fast = head;
    ListNode slow = head;
    
    while(fast != null && fast.next != null) {
    slow = slow.next;
    fast = fast.next.next;
    
    if(fast == slow){
    flag = true;
    break;
    }
    return flag;
}

2.判断一个单链表中是否有环,若有环,求进入环中的第一个节点.

Public ListNode getFirstNodeInCycle(ListNode head) {

   if(head == null) {
   return null;
   } else {

   ListNode fast = head;
   ListNode slow = head;

   while(fast != null && fast.next != null) {
   
      slow = slow.next;
      fast = fast.next.next;
  
      if(fast == slow){
      
      //有环,则返回环的第一个节点
      slow = head;
      while(slow != fast){
      slow = slow.next;
      fast = fast.next;
      }
      return slow;
      }
  }
  return null;
  }
}

更多LeetCode解题

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值