前言
对于我们算法小白来说,直接干题肯定有点迷,这里我稍微加入形象化思维,不喜勿喷。
解题思路:
题目:141.环形链表--给你一个链表的头节点 head ,判断链表中是否有环。
形象描述如下:
首先这是一个唯一指向的单向链表,用这条链表建个跑道,甲乙两个人从相同起点head处分别以1倍速和2倍速在上面跑步(假设甲1步一个节点,乙1步两个节点),如果甲乙一直跑下去能够再次相遇,那么说明这个跑道有环,如果跑得快的乙遇到了null点,那说明链表没有环;
混入逻辑解析:
- 想先起跑肯定head不为null点 =》
if(!head) return false; - 相同起点head处开跑 =》
let pre = head, cur = head; - 想一直跑的话肯定得先保证跑得快的乙不会遇到null点 =》
while(cur && cur.next)(cur.next为真保证乙每一步都能跑成功,如果在跑的那步过程中即cur.next中到null点了也是提前结束比赛) - pre代表跑得慢的甲1倍速 =》
pre = pre.next - cur代表跑得快的乙2倍速 =》
cur = cur.next.next - 一直跑的情况下如果甲乙跑到了相同节点地址即pre === cur那么说明甲乙相遇了,链表有环 =》
if(pre === cur) return true; - 如果甲乙无法一直跑,即乙先到了null点,那么终结比赛 =》
return false;
完整代码示例: var hasCycle = function(head) {
if(!head) return false;
let pre = head,cur = head;
while(pre && cur && cur.next){
pre = pre.next;
cur = cur.next.next;
if(pre === cur) {
return true;
}
}
return false;
};