面试题之链表问题 - 判断单链表是否有环?
|
2
10 答10k 看 |
给定一个单链表:
|
|
7
|
使用追赶的方法,很容易得到环的存在性结论。能够解决问题1。记下碰撞点P。 问题2的证明如下: 链表形状类似数字 6 。 分析追赶过程。 连接点为从起点走 a 步,即 S(a)。 根据假设易知 S(a-1) 在甩尾段,S(a) 在环上,而 S(x+a) 必然在环上。所以可以发生碰撞。 综上,从 x 点和从起点同步前进,第一个碰撞点就是连接点。
|
|||||||||||||||
|
2
|
问题2 知道环的长度s,那么p1从链表的头开始,p2开始指向p1的第s个后继结点,p1 p2同步往前移动,当p1==p2时,p1指向的就是环的开始。 |
|||||||||||||||
|
1
|
问题3 after p2 catches p1, let they continue going forward, and count the number of nodes p1 visits (n1). When p2 catches p1 again, n1 is the size of loop. |
|||||||||||||||
|
1
|
可在”Ge Chunyuan“的方法上加以改进: 做个友情连接,^-^
|
|||||||||||||||
|
0
|
判断是否有环。
|
|||||||||||||||
|
0
|
第二个问题,只要在return true的那个地方 return 那个节点就可以了,那个节点就是连接点了。 |
|||||||||||||||
|
0
|
我也写个答案
|
|||||||||||||||
|
0
|
在搞一个破坏性的想法 如果原来的链表是1->2->3->4>5->6->7->8->5这样一个有环的链表 我们可以这样 1.翻转链表 同时记录下整个链表的翻转长度S 并得到翻转以后的链表 1->2->3->4->5 2.遍历链表1->2->3->4->5 得到长度a 3.如果S=a没事, 如果s>a,显然有环,环的入口点在5整个节点。而且环的长度是S-2*a; 这样的效率也是不错的,就是要破坏原来的链表
|
|||||||||||||||
|
0
|
这样如何: int i, j; for( i = 0; (p->next != head) && (p->next != NULL);){ 使用backup,链表可以恢复。
|
|||||||||||||||
|
0
|
答:
|
250x |

