1. 程式人生 > >資料結構-單鏈表進階之快慢指標原理(快速查詢法)

資料結構-單鏈表進階之快慢指標原理(快速查詢法)

面試題:快速找到未知長度單鏈表的中間節點?

這個問題的解決方法分為普通方法和高階方法。

1.普通方法即我們大家都能一下子想到的,首先遍歷一遍獲取總長度L,然後再次遍歷迴圈至L/2即可;時間複雜度為:

O(L+L/2)=O(3/2L)

程式碼簡單實現:

typedef struct {
	int data;
	LNode *next;
}LNode,*LinkList;

/*
function:普通方法
首先遍歷一遍獲取總長度L,然後再次遍歷迴圈至L/2即可
*/
LNode *getElement(LinkList L) {
	if (L == NULL) {
		return NULL;
	}
	int i = 1;
	LNode *p = L->next;
	while (p!=NULL)
	{
		p = p->next;
		i++;
	}
	
	int j = 1;
	int mid = i / 2;
	LNode *midNode = L->next;
	while (j<mid)
	{
		midNode = midNode->next;
	}
	return midNode;
}

2.高階方法:快慢指標法,設定2個指標*faster,*mid都指向單鏈表的頭節點,其中faster移動的速度為mid的2倍,當faster移動到末尾,mid即在中間位置了,以下是簡單實現:

/*
function:快速查詢未知長度單鏈表中間節點
快慢指標法
*/
LNode *fasterGetElement(LinkList L) {
	LNode *mid, *faster;
	mid = L->next;
	faster = L->next;
	while (faster!=NULL)
	{
		mid = mid->next;
		//faster = faster->next->next
		faster = faster->next;
		faster = faster->next;
	}
	return mid;
}