题目
环形链表
给你一个链表的头节点 head ,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。
如果链表中存在环 ,则返回 true 。 否则,返回 false 。
题解
两种方法:哈希表、快慢指针
哈希表
java解
public class Solution {
public boolean hasCycle(ListNode head) {
// 环形链表两种方法 哈希表、快慢指针(龟兔赛跑)
// 哈希表
Set<ListNode> seen = new HashSet<ListNode>();
ListNode current = head;
// 遍历每个节点
while(current!=null){
// 看是否能加进hash表中 不能加进去说明这个节点已经存在 说明有环 返回true
if(!seen.add(current)){
return true;
}
current = current.next;
}
// 所有节点都没出现过 说明没有环
return false;
}
}
py解
class Solution:
def hasCycle(self, head: Optional[ListNode]) -> bool:
# 哈希表判断是否有环
# 先定义一个哈希表
seen= set()
current = head
while current:
if current in seen:
return True
seen.add(current)
current = current.next
return False
快慢指针
采用了龟兔赛跑的原理,兔子跑得快每次跑两格,龟跑一格,如果有环 则贵一定能追上兔子,如果没有环兔子的next遇到null就会停止。
java解
public class Solution {
public boolean hasCycle(ListNode head) {
// 快慢指针 龟兔赛跑
if (head==null || head.next==null){
return false;
}
ListNode slow = head;
ListNode fast = head.next;
while(fast!=slow){
if(fast==null || fast.next==null){
return false;
}
slow = slow.next;
fast = fast.next.next;
}
return true;
}
}
py解
class Solution:
def hasCycle(self, head: Optional[ListNode]) -> bool:
# 快慢指针 龟兔赛跑
# 定义快慢指针
if (not head) or (not head.next):
return False
fast = head.next
slow = head
while fast!=slow:
if (not fast) or (not fast.next):
return False
fast = fast.next.next
slow = slow.next
return True