Leetcode142.环形链表Ⅱ(快慢指针思想)

在这里插入图片描述
本题我们仍然用快慢指针思想去解决:
一、首先判断是否为环形链表{
此题我们用快慢指针思想去解决
①首先我们创建两个指针,一个快的(一次走两步),一个慢的(一次走一步)
②如果说我们是个环形链表的话,那么我们两个指针肯定会相遇的,就是指向同一个地址。
③如果快的指针指向了空地址,那么就意味着不是环形链表
}
二、若为环形链表,我们来确定环开始的位置{
①通过第一步我们确定了它为环形链表,
在这里插入图片描述
①这里两个快慢指针第一次相遇后,在结点7的位置,此时将我们的慢指针重新指向头节点2,
②此时我们快慢指针距离环头节点距离相同 都为3
③让我们的快慢指针都走一步,直到相遇,就是我们的环的头节点
④找到后我们对环的头节点位置输出即可
}

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *detectCycle(struct ListNode *head) {
    if(head == NULL) return NULL;
    struct ListNode *p=head,*pr=head->next;
    while(p != pr && pr && pr->next){//pr->next为了判断快指针所指的下一个是否为空,
    //如果不判断,运行可能会报错空指针问题
        p = p->next;
        pr = pr->next->next;
    }
    if(pr==NULL || pr->next == NULL) return NULL;//以上是判断是否为环链表
    p = head->next;		
    pr = head->next->next;
    while(p != pr){//通过快慢指针思想,去让两个指针第一次相遇
        p = p->next;
        pr = pr->next->next;
    }
    p = head;//将慢指针重新指向头节点
    while(p != pr){//当两个指针第二次相遇时,就是我们的环链表的开始位置
        p = p->next;
        pr= pr->next;
    }
    return p;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值