1. 判断是否是环形链表
给定一个链表,判断链表中是否有环。
1.1 借助哈希表
解题思路:
- 哈希表存遍历过的节点,每遍历一个节点,都查看哈希表是否存在当前节点,如果存在,则说明链表有环
- 如果不存在,则存入哈希表,继续遍历
代码实现如下:
var hasCycle = (head) => {
let map = new Map();
while (head) {
if (map.has(head)) return true;
map.set(head, true); // 存的是节点的地址引用,而不是节点值
head = head.next;
}
return false;
};
1.2 快慢指针法
解题思路:
- 使用追击问题的思路
两个人在跑道上赛跑,同一个起点出发,一个跑得快一个跑得慢,在某一时刻,跑得快追上跑的慢的,说明跑道上出现环形赛道了,如果没有环形赛道,则快慢两人永远不会相遇
- 一个快指针与一个慢指针同事从头部出发,慢指针走一格,快指针走两格
- 如果出现快慢指针相同时,则有环
代码实现如下:
var hasCycle = function(head) {
//如果head节点为无直接无环
if(!head) return false
//慢的为pre,快的为cur
var pre = head, cur = head
//如果有快的且快的下一步有一直循环
while(cur && cur.next) {
pre = pre.next
cur = cur.next.next
if(pre === cur) return true
}
return false;
};