题目
题目链接:leetcode-cn.com/leetbook/re…
题解
1、借助 Set 记录节点是否出现过
判断链表是否存在环,当然最简单的办法就是借助辅助空间,遍历链表,并不断把节点存在辅助空间中,当遍历时出现了相同的节点时,就说明有环;
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {boolean}
*/
var hasCycle = function(head) {
let set = new Set();
// add,delete,.size
while(head !== null) {
if(set.has(head)) {
return true;
}else {
set.add(head);
head = head.next;
}
}
return false;
};
2、快慢指针
一个走的快,一个走的慢;
如果有环,则两个指针一定会在某个时刻碰上;
如果没有环,则两个指针一定是一前一后;
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {boolean}
*/
var hasCycle = function(head) {
let quick = head,
slow = head;
// 把快慢指针的速度设置为 1:2
while(quick !== null && quick.next !== null) {
quick = quick.next.next;
slow = slow.next;
if(slow === quick) {
return true;
}
}
return false;
};
3、逐个将每个节点的 next 指向自身
这种方法并不好,因为这种方法会改变链表的结构;以下是此方法的具体描述:
循环遍历节点,逐个将每个节点的 next 指向自身;
当链表没有环时,退出出循环;
当链表有环时,会回到环在链表上的起始节点,此时此节点的next指向其本身,退出循环;
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {boolean}
*/
var hasCycle = function(head) {
let temp = head;
while(head !== null) {
if(head === head.next) {
return true;
}
head = head.next;
temp.next = temp;
temp = head;
}
return false;
};
大家如果有更好的思路和解法,欢迎大家一起来讨论啊~
这是使用 JavaScript 对 LeetCode《初级算法》的每道题的总结和实现的其中一篇,汇总篇在这里: