删除链表中倒数第k个节点

1. 问题描述

  给定一个单链表,删除它的倒数第k个节点。例如给定链表: 12345 ,删除它的倒数第二个节点后变为 1235 。可以假设倒数第k个节点总是存在。


2. 方法与思路

  很容易想到第一种方法,就是先对单链表进行进行一次遍历,求出其长度n。然后再进行第二次遍历,设一个指针,向后移动 nk 个位置,然后删除这个节点。
  第二种方法就是使用双指针,只需要对链表进行一遍访问即可。

  I. ListNode *p=*q=head
  II. q指针后移k个位置
  III. while q != end
    p,q同时后移
  IV. 删除p的下一个节点

ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode *pre=head,*end=head;

        while(n--) end = end->next;


        while(end && end->next) pre = pre->next,end = end->next;

        if(end == NULL) return head->next;
        else
        {
            ListNode *tmp = pre->next;
            pre->next = tmp->next;
            delete tmp;
        }

        return head;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值