给定一个单链表,判断其中是否有环,已经是一个比较老同时也是比较经典的问题,在网上搜集了一些资料,
然后总结一下大概可以涉及到的问题,以及相应的解法。
首先,关于单链表中的环,一般涉及到一下问题:
1.给一个单链表,判断其中是否有环的存在;
2.如果存在环,找出环的入口点;
3.如果存在环,求出环上节点的个数;
4.如果存在环,求出链表的长度;
5.如果存在环,求出环上距离任意一个节点最远的点(对面节点);
6.(扩展)如何判断两个无环链表是否相交;
7.(扩展)如果相交,求出第一个相交的节点;
type Node struct { data int next *Node } func findLoop(head *Node) bool { slow := head fast := head while(fast.next != nil && slow != nil) { slow = slow.next fast = fast.next.next if(slow == fast) { return true } } }
func findLoopStart(head *Node) *Node { slow := head fast := head while(fast.next != nil && slow != nil) { slow = slow.next fast = fast.next.next if(slow == fast) { beak; } } if(fast.next == nil || slow == nil) { return nil //没有环 } slow := head while(slow != fast) { slow = slow.next fast = fast.next } return slow }
原文:https://www.cnblogs.com/yiyezhou/p/11131741.html