单向还链表如何寻找起始节点

来源:互联网 发布:yum安装ipk 编辑:程序博客网 时间:2024/06/06 07:39

      给你一个单向链表,已知里面有一个链表环,你如何用程序找出环的起始位置?这是我在网上看到的问题,而给出的解决方法也颇为巧妙,大意就是:弄两个指针,快指针和慢指针,快指针速度是慢指针的两倍。它俩一起从链表头出发,不难想象,经历一段过程之后,它俩一定会在链表中的某一点相遇。然后把其中一个指针送回链表头节点,另一个指针呆在第一次相遇的位置,然后它俩再按照相同的速度继续前进,那么它俩第二次相遇的位置,就一定是环链表的起始位置。

     刚开始看到这种方法时,其实我内心是怀疑的。所以立马撸了份代码验证下,代码如下:

其中的linkarr就是我们的环链表【本质是一个数组伪链表,但因为我的目的只是验证,所以就不使用结构型链表了,请不要在意这些小细节】,经过若干次的实验,证明网上给出的方法确实正确无误!嗯,有意思,我这人好奇心颇重,无法容忍我不能理解的事物,所以就想在数学逻辑上给一个证明,但在证明之前,让我们先把这个专业性问题转化为更容易理解的生活型问题: 张三和李四去环绕公园散步,他们共同从公寓出发,张三的速度是李四的两倍。经过一段时间,张三和李四在公园的某一点相遇,于是它俩打电话给王二麻子,约他一起来散步。之后王二麻子从公寓出发时,张三李四一路说说笑笑继续散步,而且正好张三李四的速度和王二麻子相等。问,你如何证明,最终这三巨头会相聚在公园的门口位置??为了尽可能的方便读者朋友阅读理解,我做了一个简陋小图,如下:

其中,A点代表公寓,B点代表公园门口,C点代表张三李四第一次相遇的位置,在这里还要补充一点,就是AB距离小于2倍公园周长。

      好了,所有的情况都已说明,让我们整理下思路开证:

1):首先,当张三走到B点时,李四走了1/2 AB的长度。这样,当李四也走到B点时,张三已经在公园内溜达了,但还没有溜达完一圈;

2):然后,当张三和李四相遇在C点时,李四还没走完一圈,而且不难想象,张三所走的圈数大于1小于2;

3):这样,李四从C点继续向B点走,而张三保持速度不变的话,当李四到B点时,张三走到了D点。因为张三是李四速度两倍,所以2CB = CD,既CB = BD;

3):最后让我们整理下思路,看看他们实际走的总距离。李四在公园环绕一圈,还有公园到公寓的距离,所以李四走了  AB + 1圈 的总距离,因为张三快两倍,所以张三的总距离自然是  2*(AB+1圈) 的距离,然后代入简化,我们最后得到这样的公式::  (AB+1圈)*2  =  2圈 + AB + BD,因为BD = CB,所以最后我们证得 CB = AB!至此证毕。


      以上的证明,适用于AB距离小于公园周长。但如何AB距离超长呢?其实无所谓,不管AB距离多长,道理都是相通的。我们家乡有句俗语叫心里有,不会说,意思就是道理我懂,但说不出来。我现在就是这种状态:关于AB大于2倍周长的情况,其实也可以想得通,但如果要在这里给出文理清晰的逻辑证明,我真的做不到。因为对我而言,其中牵扯到更复杂的语言组织与数学公式,鄙人文采浅薄能力有限,就不在此献丑了。见谅!

3 0
原创粉丝点击