剑指offer面试题23:链表中环的入口节点

判断是否有环:

设置两个指针,第一个一次走一步,第二个一次走两步,如果相遇,则有环,他们走过的步数差,为环的长度n。如果第二个指针先为null,则无环。

找到入口节点

若有环,设置两个指针,第二个指针先走n步,随后两个指针一次走一步,他们的值相等的那个节点,就是入口节点。

    public ListNode EntryNodeOfLoop(ListNode pHead)
    {
    	ListNode oneStep = pHead;
    	ListNode twoStep = pHead;
    	int len = 0;
    	boolean have_circle = false;
    	for(int count=0;twoStep!=null;count++) {
    		oneStep = oneStep.next;
    		twoStep = twoStep.next;
    		if(twoStep==null) {
    			return null;
    		}
    		twoStep = twoStep.next;
    		if(oneStep.val == twoStep.val) {
    			len = count;
    			have_circle = true;
    			break;
    		}
    	}
    	if(twoStep==null&&have_circle == false) {
    		return null;
    	}else {
    		oneStep = pHead;
    		twoStep = pHead;
    		for(int count = 0;count<=len;count++) {
    			twoStep = twoStep.next;
    		}
    		while(twoStep.val!=oneStep.val) {
    			oneStep = oneStep.next;
    			twoStep = twoStep.next;
    		}
    		return twoStep;
    	}
    }

猜你喜欢

转载自blog.csdn.net/qq_40473204/article/details/112257540
今日推荐