还是上一道题,题号为牛客网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;
}

本文介绍了解决牛客网HJ51问题的一种新颖方法——快慢指针技巧。通过设置两个指针,一个快指针先前进K步,随后与慢指针同步移动直至快指针到达链表尾部,此时慢指针指向倒数第K个节点。这种方法虽时间复杂度与逐个遍历法相近,但构思巧妙。
606

被折叠的 条评论
为什么被折叠?



