我们先了解一个知识:循环链表
尾结点不指向NULL,指向头就是循环链表
那么带环链表就意味着尾结点的next可以指向链表的任意一个结点,甚至可以指向他自己
这里我们的算法思路唯一靠谱的还是快慢指针
slow一次走一步,fast一次走两步,当slow走到中间的时候,fast一定入环了,如果fast指向NULL,则该链表无环
当slow再走一半也就入环了,这个时候,由于slow走的慢,fast走的快,所以fast和slow最终会相遇的
那我们的代码就应该是
如果fast或者fast->next为NULL则返回false
当fast或者fast->next不为NULL的时候,slow走一步,fast走两步,当fast==slow,则返回true
根据思路我们就可以写代码了:
- /**
- * Definition for singly-linked list.
- * struct ListNode {
- * int val;
- * struct ListNode *next;
- * };
- */
- bool hasCycle(struct ListNode *head) {
- struct ListNode *fast=head,*slow=head;
- while(fast&&fast->next)
- {
- slow=slow->next;
- fast=fast->next->next;
- if(slow==fast)
- {
- return true;
- }
- }
- return false;
- }
当然结果也通过了