力扣 142环形链表2 快慢指针法

本文介绍了使用快慢指针法解决LeetCode上的环形链表问题,详细解析了快慢指针相遇点的计算,并讨论了在实现过程中遇到的‘runtime error: member access within null pointer of type ‘struct ListNode’’错误,分析了错误原因及解决方法,强调了在遍历链表时必须正确处理空指针的情况。
摘要由CSDN通过智能技术生成
 //此题采用快慢指针法 
 ListNode *detectCycle(ListNode *head)
    {
    	int tag=0;
        ListNode *p1,*p2,*pre;
        if(head==NULL)//因为下面用到了head->next和head->next->next所以防止空指针必须先判断 ,不然会报空指针错 
            return NULL;
        p1=head->next;
        if(p1==NULL)//因为下面用到了p1->next->next所以防止空指针必须先判断 
        	return NULL;
        p2=head->next->next;
        if(p2==NULL)
        	return NULL;
        while(p1!=NULL&&p2!=NULL)//如果有环,会相遇,不然慢指针永远追不上快的 
        {
            if(p1==p2)
            {
            	tag=1;
            	break;
			}
            p1=p1->next;
            if(p2->next==NULL)
                return NULL;
            p2=p2->next->next;
        }
        if(tag)//相遇出继续往前移动,头指针处继续往前移动,最后他们会在第一个入环节点处相遇 
		{
			pre=head;
			while(pre!=p2)
			{
				pre=pre->next;
				p2=p2->next;
			}
			return pre;
		} 
		return NULL;
    }

讲解:

在这里插入图片描述
设入环点为A,快慢指针相遇处为B,到A处走了a,A到B走了b
因为快指针速度是慢的两倍,所以慢指针走到B时,快的以及走了2(a+b)了
AB长度以知,快指针减去b再减去a+b就可以得出环的长度时a
所以重新定义一个pre指向head,开始一步一步出发,快指针也一步一步向前走,最后相遇处就是入环点

LeetCode报错:runtime error: member access within null pointer of type ‘struct ListNode’

错误原因:试图使用空指针
解决方法:增加判断条件,并且判断的顺序不能改变。排除对空指针的引用。

比如上文中用到了p2->next->next,就必须先判断p2和p2->next是不是空指针,不然会空指针报错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值