链表求环
问题描述
tips:
- [3,2,1,2,4,5,6]里面的2不是同一个节点,只是值一样,所以在借助哈希表查找的时候需要存储的是节点的全部信息,包括下一个节点,而不仅仅存节点的值。
class Solution:
def hasCycle(self, head: ListNode) -> bool:
value={}
while(head):
if head in value:
return True
else:
value[head]=1
head=head.next
return False
快慢链表的妙用
快慢链表用法
- 找中间位置
- 判断链表是否有环
- 删除某个位置的元素
链表比作一条跑道,链表中有环,那么这条跑道就是一条圆环跑道,在一条圆环跑道中,两个人有速度差,那么迟早两个人会相遇,只要相遇那么就说明有环。
为了不失一般性,我们在环上加了额外的两个节点,我们可以想象一下,只要两个指针跑进了环里,那么因为存在速度差,他们之间的距离总会由远及近,然后相遇,在远离。像极了我们人世间某些人在你生命中匆匆而过的感觉。
判断是否有环的代码
class Solution:
def hasCycle(self, head: ListNode) -> bool:
slow=head
fast=head
while(head and fast.next and (fast.next.next)):
fast=fast.next.next
slow=slow.next
if (fast==slow):
return True
return False
返回环的起点思路
相遇点到起点的位置等于head到环的起点的位置
class Solution {
public:
bool hasCycle(ListNode *head) {
ListNode *fast=head;
ListNode *slow=head;
ListNode *meet=NULL;
while(fast){
fast=fast->next;
slow=slow->next;
if(!fast){
return false;
}
fast=fast->next;
if (fast==slow){
meet=fast;
break;
}
}
if (meet==NULL)
return false;
while (head)
{
if(meet==head){
return meet;
}
head = head->next;
meet = meet->next;
}
return false;
}
};