runtime error: member access within null pointer of type 'struct ListNode'
struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
struct ListNode*p=head;
struct ListNode*pre=head;
int i=0;
while(p->next)
{
++i;
p=p->next;
if(i>n)
{pre=pre->next;}
}
struct ListNode* q=pre->next; //此处就可以运行了
/*
struct ListNode* q=pre;
q=q->next;
会导致q变为空指针
*/
printf("pre=%d",pre);
printf("q=%d",q);
(pre->next)=(q->next);
free(q);
q=NULL;
return head;
}
原因是编译器无法判断q是否为空指针,加上下面的语句就可以了.
while(q==NULL||q->next==NULL)
return q;
(pre->next)=(q->next);
源自:(29条消息) LeetCodeBug-member access within null pointer of type 'struct ListNode'_zy2317878的博客-CSDN博客
之前想不通这一段为什么不可以直接返回head头节点呢? 刚想通了: 为什么直接返回head是错误的? 是因为当所要删除节点就是head时,其实并没有删掉head,只是通过附加头节点dummy->next = dummy->next->next,跳过了head节点, 所以不能直接返回head,必须得先用一个指针ans指向dummy->next,即head节点的后一个节点.
此处还得注意的一点是,我们之所以引进哑节点,就是因为想把头节点这个特殊的节点当成一个普通节点来看, 这样的话,自然是不能够直接返回head(此时已经被当做一个普通节点了,特殊性已经消失),而是需要利用到dummy得出所要返回的节点.
最后,一个问题未解决
struct ListNode*p=head;
struct ListNode*pre=head;
int i=0;
while(p->next)
{
++i;
p=p->next;
if(i>n)
{pre=pre->next;}
}
我设定p.pre都指向head,二者指针相差n个节点的距离,通过再设置一个指针q=pre->next确定目标指针,但是报错!
尽量少使用while(p->next)这类表达,dummy和second很重要。