题目描述
题目链接:141. 环形链表 - 力扣(LeetCode)
题目分析
我们先了解一个知识:循环链表
尾结点不指向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;
}
当然结果也通过了