筆試題2——判斷鏈表是否有環,若有則返回環的第一個交點

鏈表是常有的數據結構,也是筆試、面試常客

如何判斷一個鏈表是否有環;若有環,則環的第一個交點;找鏈表的倒數第k個節點;都是快慢指針的應用;下面給出這三個的實現方法


(1)如何判斷一個鏈表是否有環

bool IsListR(LinkList* head)
{
	LinkList*pS = head;                 //慢指針
	LinkList*pF = head;                 //快指針
	while (pF != NULL && pF->next != NULL)
	{
		pS = pS->next;
		pF = pF->next->next;
		if (pS == pF)                   //如果有環,快指針必定追上慢指針
			return true;
	}
	return false;
}



(2)若有環,則環的第一個交點

LinkList* IsListR(LinkList* head)
{
	LinkList*pS = head;
	LinkList*pF = head;
	while (pF != NULL && pF->next != NULL)
	{
		pS = pS->next;
		pF = pF->next->next;
		if (pS == pF)
			break;
	}
	if (pF == NULL && pF->next == NULL)
		return NULL;
	pS = head;
	while (pS != pF)
	{
		pS = pS->next;
		pF = pF->next;
	}
	return pS;
}


找鏈表的倒數第k個節點

LinkList* IsListTailK(LinkList* head,int k)
{
	LinkList*pS = head;
	LinkList*pF = head;
	for (int i = 1; i < k; i++)   //快指針先走k-1步
	{
		if (pF == NULL)
			return NULL;
		pF = pF->next;
	}
	while (pF != NULL )
	{
		if (pF == NULL)
			return pS;
		pS = pS->next;
		pF = pF->next;
	}
	return NULL;
}




類似題目 如:給兩個鏈表,判斷是否相交,若相交,則返回交點

思路:

1、從頭遍歷兩個鏈表,記錄兩鏈表長度

2、若兩鏈表尾部相等,則說明兩鏈表肯定相交

3、長鏈表先行 兩長度差 的步數

4、然後再一起遍歷,如果相等,就返回了交點之處


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