用一個儘可能高效的演算法,查詢單向連結串列(有頭結點)中倒數第k個位置上的結點

你也是流星一条發表於2024-04-24

image

思路

  定義兩個指向連結串列首結點的指標變數,第一個指標變數向後移動k個位置後,第二個指標變數也開始跟著一起向後移動,直到第一個指標變數指向尾結點為止,第二個指標變數指向的位置結點就是倒數第k個結點,此時的時間複雜度為O(n)。

實現步驟及參考程式碼(C語言)

int LList_FindLK(LList_t *Head, DataType_t data, int k){
	// 1.定義兩個指向首結點的指標變數
	LList_t *Temp1 = Head->next;
	LList_t *Temp2 = Head->next;
	
	// 2.定義一個計數器,判定什麼時候到第k個位置
	int count = 0;
	
	// 3.Temp1從首結點開始遍歷
	while(Temp1->next != NULL)
	{
		Temp1 = Temp1->next;
		
		// 4.每移動一次,計數器+1
		count++;
		
		// 5.如果計數器的值小於k,說明沒有找到第k個位置,返回0
		if(count < k)
		{
			return 0;
		}
		// 6.如果計數器的值大於等於k,Temp2開始跟著Temp1移動
		else
		{
			Temp2 = Temp2->next;
		}
	}
	
	// 7.說明Temp1已經指向尾結點,此時Temp2指向的位置即為倒數第k個結點,輸出Temp2的data值並返回1
	printf("單向連結串列中倒數第k個位置結點的data值為:%d",Temp2->data);
	return 1;
}

相關文章