LeetCode:19. 删除链表的倒数第 N 个结点

题目

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

示例 1:

复制代码
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]

示例 2:

复制代码
输入:head = [1], n = 1
输出:[]

示例 3:

复制代码
输入:head = [1,2], n = 1
输出:[1]

提示:

  • 链表中结点的数目为 sz
  • 1 <= sz <= 30
  • 0 <= Node.val <= 100
  • 1 <= n <= sz

方法一:递归

思路:

利用递归思想遍历链表,然后从链表最后一个元素开始判断是不是题目传来的要删除的。如果是就找到上一个节点来删除。

java 复制代码
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode s=new ListNode(-1,head);
        inte(s,n);
        return s.next;
    }
    public int  inte(ListNode head, int n){
      if(head==null){
        return 0;
      }
    int  count= inte(head.next,n);
    if(count==n){
        head.next=head.next.next;
    }
    return count+1;
    }
}

方法二:双指针

//双指针,要删除第几个元素就让一个指针提前移动n+1;

//然后两个指针同时移动直到找到要删除的节点

java 复制代码
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
       //双指针,要删除第几个元素就让一个指针提前移动n+1;
       //然后两个指针同时移动直到找到要删除的节点
       ListNode s= new ListNode(-1,head);
       ListNode p1=s;
       ListNode p2=s;
       //先移动一个指针
       for(int i=0;i<n+1;i++){
        p2=p2.next;
       }
      while(p2 !=null){
        p1=p1.next;
        p2=p2.next;
        }
       p1.next=p1.next.next;
       return s.next;
    }

}
相关推荐
666HZ6661 小时前
数据结构2.0 线性表
c语言·数据结构·算法
实心儿儿2 小时前
Linux —— 基础开发工具5
linux·运维·算法
charlie1145141912 小时前
嵌入式的现代C++教程——constexpr与设计技巧
开发语言·c++·笔记·单片机·学习·算法·嵌入式
清木铎4 小时前
leetcode_day4_筑基期_《绝境求生》
算法
清木铎4 小时前
leetcode_day10_筑基期_《绝境求生》
算法
j_jiajia4 小时前
(一)人工智能算法之监督学习——KNN
人工智能·学习·算法
源代码•宸4 小时前
Golang语法进阶(协程池、反射)
开发语言·经验分享·后端·算法·golang·反射·协程池
Jasmine_llq6 小时前
《CF280C Game on Tree》
数据结构·算法·邻接表·深度优先搜索(dfs)·树的遍历 + 线性累加统计
小棠师姐6 小时前
支持向量机(SVM)入门:超平面与核函数的通俗解释
算法·python机器学习·支持向量机svm·超平面可视化·核函数应用
im_AMBER6 小时前
Leetcode 102 反转链表
数据结构·c++·学习·算法·leetcode·链表