考察的知识点:与链表有关的题基本都是插入,删除,交换顺序等,解决这些问题通常将链表的指针进行修改。
问题分析:首先说一下这道题和链表中是否有环的区别:1. 其中链表有环,是最后结点的next指向前面的某个结点,构成一个环状;2.而这道题最后一个节点的next指向空,是没有环状结构的,但是前面结点中的值有的是重复的(每只牛编号唯一),这些重复的值可以构成“环状”,可以说是将值模拟成环状。
解题思路:链表中是否有环,通常用快慢指针来解决,慢指针走一步,快指针走两步,当有环时,快慢指针必相遇,**为什么必相遇?** 假设链表带环,两个指针最后都会进入环,快指针先进环,慢指针后进环。当慢指针刚进环时,可能就和快指针相遇了,最差情况下两个指针之间的距离刚好就是环的长度。此时,两个指针每移动一次,之间的距离就缩小一步,不会出现每次刚好是套圈的情况,因此:在满指针走到一圈之前,快指针肯定是可以追上慢指针的,即相遇。**而且相遇之前这个环最对被遍历两边。** 所以上面这道题就可以用快慢指针来解决,遍历重复数据最多将遍历两遍。
本题解析所用的编程语言:c++
代码如下:
bool hasCycle(ListNode* head) { // write code here ListNode* slow = head, * fast = head->next; while (fast != nullptr && fast->next != nullptr) { if (slow->val == fast->val) return true; slow = slow->next; fast = fast->next->next; } return false; }