鏈表中環的入口結點

題目:給一個鏈表,若其中包含環,請找出該鏈表的環的入口結點,否則,輸出null。

思路:首先,判斷鏈表是否有環,即採用兩個快慢指針,若相遇,有環。不然直接返回null。然後,尋找入環結點。根據環中結點的個數,使快指針先走這個數,然後依次移動,最終的相遇點,即爲入環結點。

PS:關於求環中結點個數。前期快慢指針相遇後,證明有環。則定義一個計數器,保證一個結點不動,依次移動另一個,直到兩個結點再次相遇,此時計數器即爲環中結點個數。

 

public static ListNode EntryNodeOfLoop(ListNode pHead) {
		if(pHead==null)
			return null;
		
		ListNode pNode = new ListNode(0);
		ListNode pNode1 = new ListNode(0);
		ListNode pNode2 = new ListNode(0);
		ListNode pNode3 = new ListNode(0);
		pNode = pHead;
		pNode1 = pHead;
		pNode2 = pHead;
		pNode3 = pHead;
		boolean flag = false;
		
		while(pNode3!=null) {
			pNode3 = pNode3.next;
			if(pNode3!=null)
				pNode3 = pNode3.next;
			
			if(pNode3==pNode) {
				flag = true;
				break;
			}
			pNode = pNode.next;
		}

		if(flag) {
			pNode3 = pNode3.next;
			
			int num = 1;
			while(pNode3!=pNode) {
				pNode3 = pNode3.next;
				num++;
			}
			
			while(num!=0) {
				pNode1 = pNode1.next;
				num--;
			}
			
			while(pNode1!=pNode2) {
				pNode1 = pNode1.next;
				pNode2 = pNode2.next;
			}
			return pNode2;
		}
		else {
			return null;
		}
			
	}

希望看到我代碼的各位看官,多多吐槽,我也想簡潔,可是實力不允許啊!!(淚目~)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章