单向还链表如何寻找起始节点
2016-01-13 17:47
260 查看
给你一个单向链表,已知里面有一个链表环,你如何用程序找出环的起始位置?这是我在网上看到的问题,而给出的解决方法也颇为巧妙,大意就是:弄两个指针,快指针和慢指针,快指针速度是慢指针的两倍。它俩一起从链表头出发,不难想象,经历一段过程之后,它俩一定会在链表中的某一点相遇。然后把其中一个指针送回链表头节点,另一个指针呆在第一次相遇的位置,然后它俩再按照相同的速度继续前进,那么它俩第二次相遇的位置,就一定是环链表的起始位置。
刚开始看到这种方法时,其实我内心是怀疑的。所以立马撸了份代码验证下,代码如下:
其中的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倍周长的情况,其实也可以想得通,但如果要在这里给出文理清晰的逻辑证明,我真的做不到。因为对我而言,其中牵扯到更复杂的语言组织与数学公式,鄙人文采浅薄能力有限,就不在此献丑了。见谅!
刚开始看到这种方法时,其实我内心是怀疑的。所以立马撸了份代码验证下,代码如下:
其中的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倍周长的情况,其实也可以想得通,但如果要在这里给出文理清晰的逻辑证明,我真的做不到。因为对我而言,其中牵扯到更复杂的语言组织与数学公式,鄙人文采浅薄能力有限,就不在此献丑了。见谅!
相关文章推荐
- C语言单向链表的表示与实现实例详解
- 浅谈Python单向链表的实现
- 单向链表
- IPV6可以为每一粒沙子分配一个ip地址的证明
- 单向链表插入实现
- 链表基本操作的实现
- cci-Q2.2 链表倒数第n节点值
- C语言学习之单向链表操作
- 给自己的一封短信
- 办公室中打水故事
- 信息增益(互信息)非负性证明
- 编程之美1.13 威佐夫博奕拓展的分析与论证
- 最小生成树(Prim算法和Kruskal算法)—理解与论证
- 编程之美1.13 威佐夫(NIM)博奕(Wythoff Game)涉及的数学定理论证
- 《编程之美》1.6 饮料供货——贪心解法证明
- 单向链表的创建 输入 输出
- Leetcode Linked List Cycle 循环链表
- 证明书怎么写
- 单向链表逆转
- 证明:一个有n个结点的非空二叉树的高度至少为lgn