141.环形链表
题目
给定一个链表,判断链表中是否有环。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
这里的pos和解题没啥关系,是leetcode测试用的。
示例
示例 1:
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。示例 2:
输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。
示例 3:
输入:head = [1], pos = -1
输出:false
解释:链表中没有环。
思路
这个题目的pos写的很迷惑哈哈,还以为链表给了末尾结点的值呢,如果pos等于-1就无环,其他值就有环。写完发现不对才看的题解,原来题目的意思就是让判断是不是有环的链表。
这里发现了一个很有意思的思路,即快慢指针
假设有快慢两个运动员,快的运动员一次跑两步,慢的运动员一次跑一步,如果跑道是圆环的,那么第二圈的时候一定会相遇,如果是直线的就不会相遇。以两个运动员是否相遇作为有环和无环的判断条件。
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
bool hasCycle(ListNode *head) {
if(head==NULL)
return false;
ListNode* fast{ head };//快指针
ListNode* slow{ head };//慢指针
while(fast->next!=NULL&&fast->next->next!=NULL)
{
fast=fast->next->next;//快的运动员一次跑两步
slow=slow->next;//慢的运动员一次跑一步
if(fast==slow)//如果相遇代表有环
return true;
}
return false;
}
};
昨天说的要开始看论文了,可惜今天学校云开课有五节课,还要改师兄的论文图,感觉是没时间看论文了。有想法把看论文的笔记也放在csdn上更新,编辑起来还是比较方便的。