快慢指针的应用及其原理(链表中)

快慢指针的应用
快慢指针的概念

在一个链表中使用速度不同的两个指针,解决一些链表中的实际问题.

该方法的主要应用场景:

  • 判断一个链表中是否含有环
  • 若一个链表中含有环,找到环路开始的位置
  • 求链表中倒数第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只走一步,那么只要有环,就可以相遇)==

img


判断一个链表中的环的 长度

前提是该链表有环.

由上述可知,如果有环,那么快指针和慢指针就会相遇,如果相遇了,那么令其中一个指针每步走一个格,另一个不动,记录两个指针相遇时所走的格数,就是环的长度.

查找入口结点

假设假设已经知道了链表中环的长度,那么令快指针和慢指针初始化为头指针,快指针比慢指针多走n-1步(n是指环的长度);

当两者再次相遇的时候,说明到了入口结点;

==参考于:知乎==

参考于:B站视频,个人觉得视频通俗易懂;

(https://www.bilibili.com/video/BV1R7411G78m?from=search&seid=17241189924549668943)视频,个人觉得视频通俗易懂;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值