链表判环

如何判断一个单链表是否有环?有环的话返回进入环的第一个节点的值,无环的话返回-1。如果链表的长度为N,请做到时间复杂度O(N),额外空间复杂度O(1)。

给定一个单链表的头结点head(注意另一个参数adjust为加密后的数据调整参数,方便数据设置,与本题求解无关),请返回所求值。

思路:先用两个指针A和B,A跳一步,B跳两步,如果重逢了,就再将A重置到头结点,然后循环A和B同时跳一步,并判断A和B是否相等,如果相等,则表示是环的起始节点;

代码如下:

package lianbiao;

public class lianbiaopanhuan {

	public static void main(String[] args) {
               ListNode l1 =new ListNode(1);
               ListNode l2 =new ListNode(2);
               ListNode l3 =new ListNode(3);
               ListNode l4 =new ListNode(4);
               ListNode l5 =new ListNode(5);
               l1.next = l2;
               l2.next = l3;
               l3.next = l5;
               l4.next = l5;
	           l5.next = l3;
	           System.out.println(lianbiaopanhuan.chkLoop(l1, 5));
	}
	
	public static int chkLoop(ListNode head, int adjust) {
          ListNode first = head;
          ListNode second = head;
          if(first == null || second == null)
        	  return -1;
          while(second != null){
        	  first = first.next;//跳一步
        	  second = second.next.next;//跳两步
        	 
        	  if(first == second){
        		  break;
        	  }
          }
          first = head;
          while(first != second){
        	    first = first.next;
        	    second = second.next;
          }
          System.out.println(first.val+"是链表头的值");
          return first.val;
	}
	static class ListNode{
		int val = 0;
		ListNode next = null;
		ListNode(int val){
			this.val =  val;
		}
	}
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值