天天看點

劍-連結清單環中的入口節點

題目描述:

一個連結清單中包含環,請找出該連結清單的環的入口結點。

1. 判斷是否為環形連結清單:設定一快一慢連個節點,慢的一次走一個節點,快的一次走2各節點。若為環形,則快節點能追趕上慢節點,記此節點為meetNode。

2. 計算環内節點數:meetNode一定在環形内,以它為起點周遊一圈,得到換内節點數量,記為n。

3. 找的入口節點:設定node1,node2節點同時從頭結點出發,node2先走n步,然後node1、node2同時走,當兩節點相遇時的節點,即為入口節點。

public ListNode EntryNodeOfLoop(ListNode pHead) {
		ListNode n1 = pHead;
		ListNode n2 = pHead;
		
		//尋找環内一節點
		while (n2.next != null && n2 != null) {
			n1 = n1.next;
			n2 = n2.next.next;
			if (n1 == n2)
				break;
		}
		
		if (n2 == null || n2.next == null) {
			return null;
		}
		
		//計算換内節點數
		int count = 1;
		n2 = n2.next;
		while (n2 != n1) {
			n2 = n2.next;
			count++;
		}
		
		//尋找入口節點
		n1 = pHead;
		n2 = pHead;
		for (int i = 0; i < count; i++) {
			n2 = n2.next;
		}
		while (n1 != n2) {
			n1 = n1.next;
			n2 = n2.next;
		}
		return n1;
	}
           

繼續閱讀