[链表专题]删除链表的倒数第 N 个结点

描述

本题是力扣的19. 删除链表的倒数第 N 个结点

考点

  • 快慢指针/双指针

题解

class Solution {
 public:
  ListNode* removeNthFromEnd(ListNode* head, int n) {
   ListNode *dummyHead = new ListNode(-1, head);
   ListNode *slow = dummyHead;
   ListNode *fast = dummyHead;
   while(n--){
    fast = fast->next;
   }
   while(fast->next != nullptr){
    slow = slow->next;
    fast = fast->next;
   }
   slow->next = slow->next->next;
   return dummyHead->next;
  }
};

思路

题目要求删除链表的倒数第 n 个结点,这里需要使用快慢指针来完成这一操作

首先新建一个dummyHead伪节点,链表操作必备;假设我们需要删除链表{1, 2, 3, 4}的倒数第2个节点,即节点3

画图比划一下,用fast指针指向最后一个节点,用slow指针指向倒数第n+1个节点(因为要删除倒数第n个节点)

然后将它们平移到初始位置,是不是一目了然了~

步骤清晰如下:

  1. 快慢指针都从dummyHead起始

  2. 快指针先走n步

  3. 快慢指针一起走,直到快指针到达最后一个节点,此时慢指针的下一个节点就是待删除节点

当然也可以不用快慢指针,使用老办法递归:

  1. 子问题与返回值:每次判断本节点是否应该被删除。若要被删除,则返回next值;若不需要被删除,返回自身

    实际上就是返回应该存在于链表的节点

  2. 递归语句顺序:递归方向分为一去一回,去方向到达临界点后返回;这里选择回方向操作,因为要计算倒数

  3. 临界点:节点为nullptr时返回,意味着nullptr节点存在于链表

class Solution {
 private:
  int n;
  ListNode* recursiveFunc(ListNode* head) {
   if (head == nullptr) return nullptr;
   head->next = recursiveFunc(head->next);
   if (--n == 0) return head->next;
   return head;
  }
 public:
  ListNode* removeNthFromEnd(ListNode* head, int _n) {
   n = _n;
   return recursiveFunc(head);
  }
};

更多

恭喜你完成本题!

你可以选择继续下一题,或移步至仓库开始更多类型的挑战:https://fi3wey.github.io/

仓库内包含了更多经典案例的逻辑剖析与实现细节,助你在算法的学习之旅上一往无前!

看官若还满意,还请Star一下哟~

关注公众号峰狂算法,获取最新的刷题指导呀~

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值