环形链表找入环点----链表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;
}
相关推荐
白狐_798几秒前
408 数据结构|外部排序优化:怎么减少时间开销
数据结构·算法
kiracrimson12 小时前
从缓存的角度看链表与线性表的差异
数据结构·链表·缓存
心抵鹊14 小时前
归并排序之翻转对(hard)
数据结构·算法
2601_9622972516 小时前
C# vs Java vs Python:YOLO工业部署性能对比实战
java·python·c·工业视觉·性能对比
白狐_79817 小时前
408 数据结构|红黑树插入:只记两大类
数据结构
Lost of 程序猿1 天前
.NET 线程安全集合与并发数据结构深度实战:从 lock 到无锁
数据结构·安全·.net
机器学习之心1 天前
基于BiGRU-Attention的轴承剩余寿命预测(MATLAB实现):从振动信号到RUL曲线的完整闭环
数据结构·算法·matlab·轴承剩余寿命预测·振动信号·bigru-attention
青梅橘子皮1 天前
优选算法---专题2(滑动窗口)
数据结构·算法
程序猫.1 天前
双指针问题
java·数据结构·算法
50万马克的面包1 天前
数据结构:线性表 —— 顺序表与链表完整总结
数据结构·链表