思路
定義兩個指向連結串列首結點的指標變數,第一個指標變數向後移動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;
}