快慢指针及其应用

原创 2016年08月30日 09:36:49

  快慢指针,顾名思义就是设置两个指针,在同一个链表中不同步的游走。快指针每次走两步,慢指针每次走一步,如果链表不是循环链表,那么快指针会始终在慢指针前面,如果链表存在环路,那么当进入环中以后,由于快指针移动较快,它与慢指针总会有相遇的时刻。就如同我们在环形跑道上跑步一样,速度快的人在跑若干圈之后会再次追上速度慢的人,再次相遇。因此本节我们介绍如何利用快慢指针来判断一个链表是否存在环并返回环开始的结点。
  从上面的分析我们知道要判断是否存在环是比较容易的,那么如何找到并返回环开始的结点呢,具体请看这篇文章的数学推导(参考),那么最终的结论是:当快慢指针第一次在环内的某一结点处相遇时,令其中一个指针指向链表的头结点,然后二者同步移动,每次都只移动一步,最终再次相遇的地方即为环的开始结点。

node* loopStart(node* head)
{
    if(!head)
        return NULL;
    node* slow = head;
    node* fast = head;
    while(fast && fast->next)
    {
        fast = fast->next->next;
        slow = slow->next;
        if(fast == slow)
            break;
    }
    if(!fast || !fast->next)
        return NULL;
    fast = head;
    while(fast != slow)
    {
        fast = fast->next;
        slow = slow->next;
    }
    return fast;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

快慢指针应用(二)——链表排序

使用快慢指针对链表里按内容大小排序:源代码如下: #include #include typedef struct student { int num; struct student *nex...

快慢指针的概念及其应用

快慢指针的概念及其应用

快慢指针在算法题上的应用

最近在刷leetcode oj,在做题过程中发现有很多题目的解法里都用到了

快慢指针应用(一)

快慢指针中的快慢指的是移动的步长,即每次向前移动速度的快慢。例如可以让快指针每次沿链表向前移动2,慢指针每次向前移动1次。 应用一:判断单链表是否为循环链表让快慢指针从链表头开始遍历,快指针向前移动两...

快慢指针的实现

  • 2017-03-06 22:03
  • 939B
  • 下载

链表中的一些问题——快慢指针

如果需要判断一个链表是否循环,或者是否带环,或是单向的链表求中位数、倒数第n个数,可以用到快慢指针以达到最简单的方法。判断链表是否带环可以用两个指针p1,p2均指向头结点,p1每移动一次,p2遍历整个...

C语言快慢指针

#include #include #include/*用到了time函数,所以要有这个头文件*/ #define FALSE 0 #define TRUE 1 typedef int Statu...

C语言快慢指针

#include #include #include/*用到了time函数,所以要有这个头文件*/ #define FALSE 0 #define TRUE 1 typedef int Statu...

Java数据结构约瑟夫问题和腾讯面试题快慢指针找出中间节点

约瑟夫问题:据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)