链表练习题c++代码实现(三):删除链表的倒数第n个结点

1.暴力解法

暴力解法其实就很简单了两次循环,先把链表长度算出来。
然后算一下倒数第n个是整数第几个,
整一个变量n,每访问一个结点,n++一下。

2.一次循环

这个方法应该是最优解法
思路

  • 两个指针fast和slow中间间隔了n-1个结点。
  • 两个指针同步往前走
  • 当fast->next==NULL也就是fast指向最后一个结点的时候
    slow自然就指向倒数第n个结点了

这个方法只要一次循环就可以搞定

 ListNode* removeNthFromEnd(ListNode* head, int n) {
            //思路:
            /*两个指针p和q,
             *p先往前走n-1个单位,然后p,q一起往前走
             *当p->next为null的时候,q自然就指向倒数第n个结点啦
             *找到以后删除就行了
             */
           ListNode *dummyNode = new ListNode;
           dummyNode->next = head;
           ListNode *p = dummyNode, *q = dummyNode;
           ListNode *pre = dummyNode;//q针的前驱指针
           while (n-- && p != NULL) {
               p = p->next;
           }
           
           p = p->next;
           //p指针多往前走一个单位,这样p和q之间就间隔了n个结点
           //q最终就会指向n的前一个结点,即倒数第n-1个结点,这样方便删除
   
           while (p != NULL) {
               p = p->next;
               q = q->next;
           }

           q->next = q->next->next;
           return dummyNode->next;
     }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辛伯达岛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值