1. 程式人生 > >連結串列面試題之快慢指標問題(一) 查詢連結串列中間節點

連結串列面試題之快慢指標問題(一) 查詢連結串列中間節點

查詢連結串列中間節點

微笑一.問題描述

        給點一個連結串列,返回該連結串列的中間節點。

疑問二.問題分析

        假定一個連結串列中節點資料依次為(單數):1->2->3->4->5->(NULL),基於這個問題,首先我們會想到一種比較low的解決辦法:遍歷整個連結串列,得到連結串列總個數,取連結串列中值,再遍歷一遍連結串列,找出連結串列中間節點(節點3)。當你寫出這種程式碼的時候,面試官肯定會讓你將其優化,程式碼執行效率較低。換種角度思考這個問題:假設分別定義一個快指標(走兩步)和慢指標(走一步),當快指標遍歷完整個連結串列時,慢指標剛好指向連結串列中間節點,這樣我們通過只遍歷一遍連結串列的方式得到連結串列中間節點。

大笑三.問題解決

1.程式碼實現

typedef int DataType;
//定義結構體
typedef struct LinkNode
{
	DataType data;  //data存放指標資料
	struct LinkNode *next;   //next為指向連結串列下一個節點指標域
}*pLinkNode,*pLinkList;

//查詢連結串列中間節點
pLinkNode FindMidNode(pLinkList *pHead)
{
	assert(*pHead);
	pLinkNode slow=*pHead;  //慢指標
	pLinkNode fast=*pHead;  //塊指標
	while(fast && fast->next)    //迴圈條件缺一不可(缺少程式會崩潰),連結串列節點個數可能為為奇數或偶數
	{
		slow=slow->next;   //慢指標走一步
		fast=fast->next->next;  //快指標走兩步
	}
	return slow;  //返回中間節點
}
2.程式碼測試

(1)連結串列個數為奇數


(2)連結串列個數為偶數