leetcode141.环形链表
此题我们用快慢指针思想去解决
①首先我们创建两个指针,一个快的(一次走两步),一个慢的(一次走一步)
②如果说我们是个环形链表的话,那么我们两个指针肯定会相遇的,就是指向同一个地址。
③如果快的指针指向了空地址,那么就意味着不是环形链表
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
bool hasCycle(struct ListNode *head) {
if(head==NULL) return false;//先判断头结点是否为空
struct ListNode *p=head,*pr=head->next;
while( p != pr && pr && pr->next){//循环结束条件:若两个指针指向同一个地址则是循环链表,
//否则快指针怎么可能和慢指针相遇呢!
//pr为了判断下一个是否为空
//pr->next是为了处理pr的下一个不为空,pr有所指向,否则会报错空指针。
p = p->next;//p是慢指针走一步
pr = pr->next->next;//pr是快指针,走两步
}
return pr && pr->next; //有可能pr不为空,但是pr->next为空
}
主页里还要leetcode142 对快慢指针思想和的强化使用