认识链表
链表:是一种不连续合集的数据结构。
应用场景:
链表 VS 数组
数组:
-
优点:
- 能快速定位到具体的某个值
-
缺点:
- 数组长度固定,不利于扩展
链表:
-
优点:
- 长度可任意增加
-
缺点:
- 不利于快速搜索
141. 环形链表
题目描述:
给你一个链表的头节点 head ,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。
解题思路:快慢指针法
使用两个指针,slow指针和fast指针。slow指针每次向后移动一步,fast指针每次向后移动两步。当两指针能够再次相遇时,则有环,否则无环。
/**
* @param {ListNode} head
* @return {boolean}
*/
var hasCycle = function(head) {
if(!head) return false;
let p = head, q = head.next;
while(p != q && q && q.next){
p = p.next;
q = q.next.next;
}
return p == q;
};
解决思路:哈希法
- 使用一个空的数组temp,暴力遍历链表。
- 每移动一步就判断当前的节点是否包含在temp数组里,如果存在则说明有环,终止循环。否则第2步骤,直到循环到null结束,则无环
/**
* @param {ListNode} head
* @return {boolean}
*/
var hasCycle = function(head) {
// 哈希法
if(!head) return false;
let arr = [];
while(head != null) {
if(arr.includes(head)) {
return true;
}
arr.push(head);
head = head.next;
}
return false;
};
自述
算法小白一个,记录自己的算法学习之路。如果您发现问题,欢迎留言交流。