Fork me on GitHub

链表中环的入口结点

题目描述

给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
/**
 * 
 * @author gentleKay
 * 题目描述
 * 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
 */

public class Main54 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
	}
	
	 public class ListNode {
	    int val;
	    ListNode next = null;

	    ListNode(int val) {
	        this.val = val;
	    }
	}
	 
	 
	public ListNode EntryNodeOfLoop(ListNode pHead){
        if (pHead == null || pHead.next == null) {
        	return null;
        }
        
        ListNode p1 = pHead;
        ListNode p2 = pHead;
        while (p2 != null && p2.next != null) {
        	p1 = p1.next; // 一个慢指针
        	p2 = p2.next.next; // 一个快指针   这样如果存在环的话一定会相遇 p1 == p2;
        	if (p1 == p2) {
        		p2 = pHead;  // 在设置一个指针,为慢指针。
        		while (p1 != p2) {
        			p1 = p1.next;
        			p2 = p2.next;
        		}
        		if (p1 == p2) { //一旦他们相等 就返回 这个结点
        			return p1;
        		}
        	}
        }
        return null;
    }

}

  

posted @ 2019-07-17 11:44  gentleKay  阅读(127)  评论(0编辑  收藏  举报