*** 单链表有环都是从尾结点指向前面的结点产生的环***
leetcode 链表141题:
给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
解题思路:
用两个快慢指针p和q,若有环则两个指针会相遇,否则无环
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode LNode;
bool hasCycle(struct ListNode *head) {
if(head==NULL||head->next==NULL)
return false;
LNode *p=head,*q=head; //p慢指针,q快指针
while(p&&q){
if(p->next==NULL||q->next==NULL) //要先判断p和q的下一个尤其是q的下一个是否为空
return false; //因为再下一条判断中会用到q->next->next
if(p->next==q->next->next) //若q->next为空,则会产生对空指针的越界
return true;
p=p->next;
q=q->next->next;
}
return false;
}