链表——删除链表的倒数第 N 个结点

1、递归:

  1. 结束条件是节点是否为null;
  2. 然后递归调用,每次调用返回当前的倒数序号,比如说null为0,倒数第一个就是0+1,依次加1;
  3. 当前函数返回的整数表示当前的节点是倒数第几个;
  4. 返回到上一级后,判断返回的序列号;比如说我们要删除倒数第二个,如果返回倒数第三层的x=2,就删除当前元素的下一个元素;(因为返回的x一定是下一层的序号)
  5. 需要注意的是:
    1. 有可能删除第一个元素,但是第一个元素没有前一个节点,所以需要添加一个虚拟节点;
java 复制代码
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
       ListNode demy = new ListNode();
       demy.next = head;
        demo(demy,n);
        return demy.next;
    }

    public int demo(ListNode node,int n){
         if(node==null){
            return 0;
        }
       int x =  demo(node.next,n);
       if(x==n){
        node.next= node.next.next;
       }
       return x+1;
    }
}

2、快慢指针法

  1. 因为可能删除第一个节点,所以需要一个虚拟节点,
  2. 删除元素,需要当前删除元素的上一个节点来操作;
  3. 比如说:删除倒数第二个元素,那就需要找到倒数第3个元素;
  4. 快慢指针,那就是让快指针先走三步;然后两个指针一起走;
  5. 当快指针走到null时,正好慢指针就是到倒数第三个元素;
  6. 然后使得left.next=left.next.next;
java 复制代码
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dummy  = new ListNode();
        dummy.next = head;
        ListNode left = dummy;
        ListNode right =dummy;
        int i =0;
        while(i<n){
            right = right.next;
            i++;
        }
        while(right.next !=null){
            left   = left.next;
            right = right.next;
        }
        left.next =left.next.next;
        return dummy.next;

    }
}
相关推荐
海清河晏1113 小时前
数据结构 | 单循环链表
数据结构·算法·链表
skywalker_118 小时前
力扣hot100-3(最长连续序列),4(移动零)
数据结构·算法·leetcode
_日拱一卒8 小时前
LeetCode:除了自身以外数组的乘积
数据结构·算法·leetcode
计算机安禾8 小时前
【数据结构与算法】第36篇:排序大总结:稳定性、时间复杂度与适用场景
c语言·数据结构·c++·算法·链表·线性回归·visual studio
计算机安禾9 小时前
【数据结构与算法】第35篇:归并排序与基数排序
c语言·数据结构·vscode·算法·排序算法·哈希算法·visual studio
专注API从业者9 小时前
淘宝商品详情 API 与爬虫技术的边界:合法接入与反爬策略的技术博弈
大数据·数据结构·数据库·爬虫
汀、人工智能10 小时前
[特殊字符] 第66课:跳跃游戏
数据结构·算法·数据库架构·图论·bfs·跳跃游戏
汀、人工智能10 小时前
[特殊字符] 第70课:加油站
数据结构·算法·数据库架构·图论·bfs·加油站
favour_you___10 小时前
2026_4_8算法练习题
数据结构·c++·算法
汀、人工智能10 小时前
[特殊字符] 第57课:搜索旋转排序数组
数据结构·算法·数据库架构·图论·bfs·搜索旋转排序数组