Leecode_19_删除链表的倒数第N个节点

 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很重要。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值