单链表有环是指原来的尾指针指向了该链表中的任意一个结点(不一定是头结点,也就是说不一定是循环链表)
思路:设置两个指针fast和slow,都从链表头结点出发。fast每次步进2,slow每次步进1,因此fast相对于slow的步进速度是1。若有环则二者一定会重合,若无环则fast最先为NULL
代码如下:
int process(Node * L){
assert(L != NULL);
Node * slow = L, * fast = L;
do{
slow = slow->next;
fast = fast->next;
if(fast == NULL) break; //注意fast两次移动之间也要做判断,否则NULL->next必然出错
fast = fast->next;
} while(fast != NULL && slow != fast);
if(fast == NULL) return 0; //有环
else return 1;
}