141. 环形链表
目录
1、题目描述
给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
试题链接:https://leetcode-cn.com/problems/linked-list-cycle/
2、先来介绍三种奇葩的做法
2.1、断定链表长度不超过10000
public static boolean hasCycle(ListNode head) {
//定义末尾指针,指向尾部
ListNode p2 = head;
int size = 1;
while (p2 != null) {
p2 = p2.next;
size++;
if(size > 10_000) {
return true;
}
}
return false;
}
测试结果:
2.2、断定遍历时间不超过1ms
public static boolean hasCycle(ListNode head) {
//定义末尾指针,指向尾部
ListNode p2 = head;
long start = System.currentTimeMillis();
while (p2 != null) {
p2 = p2.next;
if(System.currentTimeMillis() - start > 1) {
return true;
}
}
return false;
}
测试结果:
2.3、断定链表中没有-1000000000的数字
public static boolean hasCycle(ListNode head) {
//定义末尾指针,指向尾部
ListNode p2 = head;
while (p2 != null) {
if(p2.val == -1000000000) {
return true;
}
p2.val = -1000000000;
p2 = p2.next;
}
return false;
}
测试结果:
3、快慢指针法
3.1、java语言实现
public static boolean hasCycle(ListNode head) {
if(head == null || head.next == null)
return false;
//快慢指针法
ListNode p1 = head; //快指针
ListNode p2 = head; //慢指针
while(p1 != null && p2 != null && p1.next != null) {
p1 = p1.next;
if(p1 == p2) {
return true;
}
p2 = p2.next;
p1 = p1.next;
}
return false;
}
测试结果:
3.2、C语言实现
bool hasCycle(struct ListNode *head) {
if(head == NULL || head->next == NULL)
return false;
//快慢指针法
struct ListNode* p1 = head; //快指针
struct ListNode* p2 = head; //慢指针
while(p1 != NULL && p2 != NULL && p1->next != NULL) {
p1 = p1->next;
if(p1 == p2) {
return true;
}
p2 = p2->next;
p1 = p1->next;
}
return false;
}
测试结果: