19. 删除链表的倒数第 N 个结点(Leetcode刷题 快慢双指针法)

19. 删除链表的倒数第 N 个结点(Leetcode刷题 快慢双指针法)

题目

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

进阶:你能尝试使用一趟扫描实现吗?

示例

在这里插入图片描述

输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]

输入:head = [1], n = 1
输出:[]

输入:head = [1,2], n = 1
输出:[1]

解题思路

快慢指针,快指针先走n步,然后快慢一起走,直到快指针走到最后,要注意的是可能是要删除第一个节点,这个时候可以直接返回head -> next

解题代码

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
    	//快指针是从head->next开始的,从head开始,则慢指针需要prev的信息
        ListNode* fast_node=head->next;
        ListNode* slow_node=head;
        //如果说链表为空,或者链表只有一个结点,则返回空
        if(!head || !head->next) return NULL;
        //否则,快指针先走n步
        for(int i =0;i<n;i++){
        	//在快指针走的过程中,需要判断其是否为空
        	//如果说快指针为空,那么该链表其实就是要删除第一个结点
        	//直接返回head->next即可
            if(!fast_node) return head->next;
            fast_node=fast_node->next;
        }
        //如果说快指针成功走了n步
        //此时快慢指针一起走,直到快指针到达链表的末尾
       while(fast_node){
           fast_node=fast_node->next;
           slow_node=slow_node->next;
       }
       //此时,慢指针的下一个结点要被删除
       slow_node->next=slow_node->next->next;
      	//最后返回链表的起始结点
       return head;
    }
};

代码执行效率

执行用时:4 ms, 在所有 C++ 提交中击败了81.80%的用户 内存消耗:10.3 MB, 在所有 C++
提交中击败了90.18%的用户

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值