题目
输入一个链表,输出该链表中倒数第k个结点。
分析
我们在解决这道题目之前,我们先回顾一下双指针思路的讲解https://blog.csdn.net/weixin_52664715/article/details/120746151?spm=1001.2014.3001.5501
我们在学习了双指针的解决思路之后,我们面对这一类型的题目首选任然是双指针方法去解决,那么我们应该怎样使用该方法去解决呢?
我们分析题目知道,题目要求我们找到倒数第k个结点,那么我们的首要问题就是这么去找到这个位置,我们任然举例追击相遇的问题,在桥上,有两辆相同的自行车,两车的移动速度相同,但我们让一辆自行车先向前移动3m,那么我们现在再让两车同时出发,那么最终的结果是出发距离提前的自行出先到达,同时后面的自行车与已经到达的自行车之间的距离仍为3m
那么我们在解决这道问题也是相同的,我们仍然设置两个指针,一个快指针fast,一个慢指针slow,但这一次我们不再是让快指针每一次移动k个距离单位,而是让我们的快指针先移动k个单位距离之后,快慢指针一起移动
此时我们遍历我们的链表,直至fast指针先移出链表范围,此时我们的slow指针指向的位置就是我们链表中倒数的k个结点
但是我们仍要考虑一些特殊情况,当我们让fast指针先移动时,如果我们的要查找倒数第9个数,可是我们的链表中只含有3个元素时,我们是没有这个元素的,那么我们就要增加判断代码
代码
struct ListNode* FindKthToTail(struct ListNode* pListHead, int k )
{
ListNoed* fast,*slow;
fast = slow = pListHead;
while(k--)//我们先让fast指针向前移动
{
if(fast = NULL)//判断如果我们当前fast指针指向为NULL,那么我们就返回,查找不到;这里就解决了我们上面提到的链表中只含有3个元素,但我们却要找倒数第9个元素,当fast移动4个单位距离时,fast指针指向的就是NULL,此时我们结束,返回NULL
return NULL;
fast = fast->next;
}
while(fast)
{
fast = fast->next;
slow = slow->next;
}
return slow;
}
总结
快慢指针在我们数据结构中的链表问题经常使用,也是十分经典的解决方法,我们这里就不在是简单的双指针的直接应用,多了一些分析,在后面的问题中会经常使用,在后面我也会继续分析与记录
以上就是我对这种方法的个人理解
上述内容如果有错误的地方,还麻烦各位大佬指教【膜拜各位了】【膜拜各位了】