快慢指针的应用
快慢指针的概念
在一个链表中使用速度不同的两个指针,解决一些链表中的实际问题.
该方法的主要应用场景:
- 判断一个链表中是否含有环
- 若一个链表中含有环,找到环路开始的位置
- 求链表中倒数第k个
个人只碰到了第三个,所以先将第三个写出来
求链表中倒数第k个
剑指 Offer 22. 链表中倒数第k个节点
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。
例如,一个链表有
6
个节点,从头节点开始,它们的值依次是1、2、3、4、5、6
。这个链表的倒数第3
个节点是值为4
的节点。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* getKthFromEnd(ListNode* head, int k) {
int cnt=0;
ListNode*temp1=head;//快指针
ListNode*temp2=head;//慢指针
while(cnt!=k)
{
temp1=temp1->next;
cnt++;
}
while(temp1)
{
temp1=temp1->next;
temp2=temp2->next;
}return temp2;
}
};
原理就是想让快指针先走k-1步,然后令快指针走一步,慢指针走一步,最后快指针走到null的时候,慢指针就是倒数第k个;
以下内容因为做题比较少,还没有碰到,如果碰到,再行补充代码
暂时就将原理写出来,以免日后遗忘
判断一个链表是否有环
可以设置两个指针fast,slow,fast指针每次移动两个格,而slow指针每次移动一个格.
若该链中不含有环,那么fast指针最后总会指向null;若含有环,则快指针会与慢指针在某一处相遇==(如果含有环的话,一定会相遇,因为大可以假设slow不动,而fast只走一步,那么只要有环,就可以相遇)==
判断一个链表中的环的 长度
前提是该链表有环.
由上述可知,如果有环,那么快指针和慢指针就会相遇,如果相遇了,那么令其中一个指针每步走一个格,另一个不动,记录两个指针相遇时所走的格数,就是环的长度.
查找入口结点
假设假设已经知道了链表中环的长度,那么令快指针和慢指针初始化为头指针,快指针比慢指针多走n-1步(n是指环的长度);
当两者再次相遇的时候,说明到了入口结点;
==参考于:知乎==
参考于:B站视频,个人觉得视频通俗易懂;
(https://www.bilibili.com/video/BV1R7411G78m?from=search&seid=17241189924549668943)视频,个人觉得视频通俗易懂;