单向还链表如何寻找起始节点
来源:互联网 发布: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倍周长的情况,其实也可以想得通,但如果要在这里给出文理清晰的逻辑证明,我真的做不到。因为对我而言,其中牵扯到更复杂的语言组织与数学公式,鄙人文采浅薄能力有限,就不在此献丑了。见谅!
- 单向还链表如何寻找起始节点
- Cracking the Coding Interview:: 寻找有环链表的环路起始节点
- 寻找单向链表的倒数第k个节点
- 寻找单向链表中含有环的入口节点
- Java:如何寻找单链表的中间节点
- 如何判断单链表中是否有环?如何找到环中的起始节点
- 找出有环链表中环的起始节点
- 单向链表中,如何在给定节点前快速插入一个节点?
- 单向链表中,如何在给定节点前快速插入一个节点?
- c#遍历寻找节点
- 树寻找根节点
- js-----document//寻找节点
- 寻找父节点
- 寻找左兄弟节点
- 寻找下一个节点
- 在单向链表中如何快速查到倒数第n个节点?
- 两条相交的单向链表,如何求他们的第一个公共节点
- 带环链表返回起始节点
- Quartz 2D之图形上下文及变换
- 开博啦~博啦~啦~~~
- 6735编译项目分类
- 从故事板上取视图控制器
- Android中ListView的addFooterView不显示的问题
- 单向还链表如何寻找起始节点
- 基于Android的计步器(Pedometer)的讲解
- leetcode83---Remove Duplicates from Sorted List(删除重复元素)
- 326. Power of Three LeetCode解题报告
- Genymotion 安装使用问题
- Android四大组件之广播接收器(二)
- QListWidget简单使用
- Jquery FileUpload插件获取文件名和文件大小
- extjs表单验证