【链表求环】

链表求环

问题描述
在这里插入图片描述
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;
    }
};

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值