环形链表找入环点----链表OJ---三指针

https://leetcode.cn/problems/linked-list-cycle-ii/description/?envType=study-plan-v2&envId=top-100-liked

首先,需要判断是否有环,而这里我们不单纯判断是否有环,还要为下一步做准备,需要让slow指针和fast都从头结点开始走,实现逻辑就有些不同。

cpp 复制代码
struct ListNode* slow = head,*fast = head;
while(fast != NULL)//如果fast为空,说明不会有环
{
    if(fast == NULL || fast->next == NULL)
        return NULL;
    //注意这里,||两边交换位置是会出现错误的,如果交换位置,当fast == NULL时,if语句是先判断第一个条件,那么此时会空指针进行了解引用,程序崩溃
    slow = slow->next;
    fast = fast->next->next;
    if(slow == fast)
    //....找到交点,也代表有环
}

找到交点后,我们就要引入ptr指针,来和slow指针同步移动,去寻找入环点。

cpp 复制代码
//。。。。
if(slow == fast)
{
    struct ListNode* ptr = head;
    while(ptr != slow)
    {
        slow = slow->next;
        ptr = ptr->next;
    }
    return ptr;
}

最后实现代码如下:

cpp 复制代码
struct ListNode *detectCycle(struct ListNode *head) 
{
    struct ListNode* slow=head,*fast = head,*ptr = head;
    while(fast != NULL)
    {
        if(fast==NULL || fast->next == NULL)
            return NULL;
        slow = slow->next;
        fast = fast->next->next;
        if(slow == fast)
        {
            while(ptr != slow)
            {
                ptr= ptr->next;
                slow = slow->next;
            }
            return ptr;
        }
    }
    return NULL;
}
相关推荐
丶小鱼丶7 小时前
数据结构和算法之【阻塞队列】上篇
java·数据结构
zs宝来了7 小时前
Redis 数据结构底层实现:intset、ziplist、skiplist 深度剖析
数据结构·redis·源码解析·skiplist·ziplist·intset
liuyao_xianhui8 小时前
优选算法_topk问题_快速排序算法_堆_C++
java·开发语言·数据结构·c++·算法·链表·排序算法
liuyao_xianhui8 小时前
优选算法_堆_最后一块石头的重量_C++
java·开发语言·c++·算法·链表
菜菜小狗的学习笔记8 小时前
剑指Offer算法题(十)排序
数据结构
handsomethefirst8 小时前
【算法与数据结构】【面试经典150题】【题36-题40】
数据结构·算法·面试
不知名的老吴8 小时前
深刻理解“程序 = 算法 + 数据结构”
数据结构
寒月小酒8 小时前
3.29+3.30
数据结构·算法
Rabitebla8 小时前
排序算法专题(一):插入排序 & 希尔排序
数据结构·算法·排序算法
问好眼18 小时前
《算法竞赛进阶指南》0x04 二分-1.最佳牛围栏
数据结构·c++·算法·二分·信息学奥赛