还是上一道题,题号为牛客网HJ51。
参考了大佬的思路,本题可采用快慢指针。
设置快慢两个指针:快指针走K步,然后慢指针才开始走。
初始位置均为不放元素的头结点。
这样快指针走到最后一个结点的下一个位置,也就是NULL的时候,
慢指针正好走到了倒数第K个结点。
这个方法比起上一篇中,我的逐个遍历法,其实时间复杂度差不多,但是想法很新颖,以后也许会经常用到,所以在此记录。
Node* Number(LinkedList L)
{
//记录链表的长度
int k;
cin >> k;
//设置快慢指针,起点均为头结点
Node* fast = L;
Node* slow = L;
if (k == 0)
{
slow->data = 0;
return slow;
}
for (int i = 0; i < k; i++)
{
fast = fast->next;
}
while (fast != NULL)
{
fast = fast->next;
slow = slow->next;
}
return slow;
}