写在前面: 这道题解法很多,常见的是快慢指针和哈希表法。在评论区里看到一些取巧做法,有的甚至通过破坏链表的数据结构暴力解决,让我影响比较深刻的还有一位大佬的JS写法思路:JSON.stringify不能字符串化含循环引用的结构 这写法太骚了哈哈
- 欢迎访问我的 力扣github仓库,有JavaScript和C++两个版本,每日更新
C++代码:
/**
* 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) //哈希表法
// return false;
// ListNode *p=head;
// unordered_set<ListNode*> s;
// while(s.find(p)==s.end())
// {
// s.insert(p);
// p=p->next;
// if(!p)
// return false;
// }
// return true;
if(!head) //快慢指针法
return false;
ListNode *p=head,*q=head;
while(p && p->next)
{
p=p->next->next;
q=q->next;
if(p==q)
return true;
}
return false;
}
};
JS代码:
/**
* @param {ListNode} head
* @return {boolean}
*/
var hasCycle = function(head) {
//哈希表法
// if(!head)
// return false;
// var p=head;
// var map=new Map();
// map.set(p,true);
// while(p.next)
// {
// if(map.has(p.next))
// return true;
// map.set(p.next,true);
// p=p.next;
// }
// return false;
//快慢指针法
// if(!head)
// return false;
// var p=head,q=head;
// while(p && p.next)
// {
// p=p.next.next;
// q=q.next;
// if(p==q)
// return true;
// }
// return false;
//骚做法,JSON.stringify不能字符串化含循环引用的结构
// try{
// JSON.stringify(head)
// return false;
// }catch(err){
// return true;
// }
};
141. 环形链表
给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
示例 1:
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。
示例 2:
输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。
示例 3:
输入:head = [1], pos = -1
输出:false
解释:链表中没有环。
进阶:
你能用 O(1)(即,常量)内存解决此问题吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/linked-list-cycle
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。