这是LeetCode上的 [19,删除链表的倒数第 N 个结点],难度为 [中等]

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

示例1

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

示例2

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

示例2

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

题解(双指针)
思路分析

删除链表的倒数第n个结点,我们只需要找到倒数第n+1个结点(倒数第n个结点的前一个结点),然后让倒数第n+1个结点指向倒数第n-1个结点(倒数第n个结点的下一个结点),就可以实现删除链表的倒数第n个结点

步骤

  1. 定义两个指针front,back指向头结点

  2. 第1个指针front从链表的头结点开始遍历n步,第2个指针back保持不动;

  3. 从第n+1步开始指针back也从链表的头结点开始和指针front以相同的速度遍历。

  4. 当指针p1指向链表的尾节点时指针p2正好指向倒数第n+1个节点(两个指针的距离始终保持为n)

  5. 把倒数第n+1个节点的next指针指向倒数第n-1个节点

注意:由于head是链表的第一个结点(带数据),为了减少判断head是否为null逻辑,以及防止删除头结点出现空指针异常等情况,需要提供一个哨兵结点(虚拟结点不带数据)作为头结点

代码实现

解类如下,类里包含两个方法,一个是遍历链表的,一个是删除链表的倒数第 N 个结点的

public class Solution {public static ListNode removeNthFromEnd(ListNode head, int n) {// 定义一个哨兵结点作为虚拟头结点,这样可以减少判断头结点是否为null和删除头结点逻辑判断ListNode<Integer> dummy = new ListNode<>(0);// 让哨兵结点指向头结点dummy.next = head;// 定义两个结点初始化为哨兵结点ListNode front = dummy;ListNode back = dummy;// front遍历n步for (int i = 0; i < n; i++) {front = front.next;}/* front,back以相同的速度遍历,front接上次位置遍历,back从哨兵遍历循环终止条件为front到达尾结点时*/while (front.next != null) {front = front.next;back = back.next;}// 此时back的下一个结点就是要删除的结点,让back指向下一个结点的下一个结点back.next = back.next.next;return dummy.next;}public static void printList(ListNode head) {System.out.print("[");while (head != null) {if (head.next == null) {System.out.print(head.val);} else {System.out.print(head.val + ",");}head = head.next;}System.out.print("]");}
}

结点类

public class ListNode<T> {T val;ListNode next;public ListNode() {}public ListNode(T val) {this.val = val;}public ListNode(T val, ListNode next) {this.next = next;}
}

测试类

public class Test {@org.junit.Testpublic void test1() {ListNode<Integer> head = new ListNode<>(1);ListNode<Integer> listNode = new ListNode<>(2);ListNode<Integer> listNode1 = new ListNode<>(3);ListNode<Integer> listNode2 = new ListNode<>(4);ListNode<Integer> listNode3 = new ListNode<>(5);head.next = listNode;listNode.next = listNode1;listNode1.next = listNode2;listNode2.next = listNode3;System.out.print("输入:");Solution.printList(head);System.out.println(" 2");ListNode head2 = Solution.removeNthFromEnd(head, 2);System.out.print("输出:");Solution.printList(head2);}@org.junit.Testpublic void test2() {ListNode<Integer> head = new ListNode<>(1);System.out.print("输入:");Solution.printList(head);System.out.println(" 1");ListNode head2 = Solution.removeNthFromEnd(head, 1);System.out.print("输出:");Solution.printList(head2);}@org.junit.Testpublic void test3() {ListNode<Integer> head = new ListNode<>(1);ListNode<Integer> listNode = new ListNode<>(2);head.next = listNode;System.out.print("输入:");Solution.printList(head);System.out.println(" 2");ListNode head2 = Solution.removeNthFromEnd(head, 1);System.out.print("输出:");Solution.printList(head2);}
}

测试结果

复杂度分析

假设链表长度为n

时间复杂度:需要遍历链表,故时间复杂度为O(n)
空间复杂度:只声明几个固定的结点,故空间复杂度为O(1);

Java每日一题——>19. 删除链表的倒数第 N 个结点相关推荐

  1. LeetCode每日一题 19. 删除链表的倒数第N个节点

    题目链接 思路 双指针,保持两个指针距离为n.引入头节点方便统一处理. class Solution {public:ListNode* removeNthFromEnd(ListNode* head ...

  2. 力扣—— 19. 删除链表的倒数第 N 个结点(java)、剑指 Offer 22. 链表中倒数第k个节点(java)

    19. 删除链表的倒数第 N 个结点(java) 一.题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. 进阶:你能尝试使用一趟扫描实现吗? 输入:head = [1,2,3 ...

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

    19. 删除链表的倒数第 N 个结点 Ideas 链表经典题目,还是09年考研408数据结构最后一道大题,在LeetCode上只能算中等难度的题目. 说回题目其实不难,之前跟着左神练了很多双指针的题目 ...

  4. 【LeetCode】【HOT】19. 删除链表的倒数第 N 个结点(双指针)

    [LeetCode][HOT 100]19. 删除链表的倒数第 N 个结点 文章目录 [LeetCode][HOT 100]19. 删除链表的倒数第 N 个结点 package hot;import ...

  5. 【力扣(LeetCode)】【C/C++】【19.删除链表的倒数第 N 个结点】

    学习时间: 2023年1月30日 题目描述: 题解分享: // 作 者 : 繁 华 倾 夏 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h&g ...

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

    描述: 19. 删除链表的倒数第 N 个结点 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. 进阶:你能尝试使用一趟扫描实现吗? 示例 1: 输入:head = [1,2,3,4, ...

  7. leetcode 19. 删除链表的倒数第 N 个结点(双指针应用)

    给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. 示例 1: 输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5] 示例 2: 输入:head = [1 ...

  8. 29. Leetcode 19. 删除链表的倒数第 N 个结点 (链表-双指针)

    给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点.示例 1:输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5] 示例 2:输入:head = [1], ...

  9. 2095. 删除链表的中间节点、19. 删除链表的倒数第 N 个结点、148. 排序链表

    LeetCode题解 1.2095. 删除链表的中间节点 2. 删除链表的倒数第 N 个结点 3.排序链表 1.2095. 删除链表的中间节点 题目描述: ➡️挑战链接⬅️ 分析: 首先题目要求我们删 ...

最新文章

  1. Everyday English
  2. POJ 1150 The Last Non-zero Digit 《挑战程序设计竞赛》
  3. 使用Arcgis进行画面(线)并计算大小(长度)。
  4. linux进程和线程教程,Linux下查看进程和线程
  5. 30名工程师,历时1300天打造,又一“国产”AI框架开源了
  6. 0基础学python有多难-0基础纯小白学Python,请注意这2个坑
  7. oracle设置口令期限,[20180316]改变oracle用户口令时限.txt
  8. c语言智能公交系统,基于单片机智能公交小车控制系统设计(含电路图,程序清单)...
  9. Eplan P8 2.7 win10 激活失效
  10. Android 开发系列教程之(一)Android基础知识
  11. The Feynman Technique The Best Way to Learn Anything理查德•弗曼学习法
  12. 档案计算机管理软件,档案管理软件系统
  13. 中国海洋科技发展迅速 海洋重器世界领先
  14. 小米路由mini刷潘多拉及老毛子固件-详细教程
  15. 安卓马赛克view_去马赛克软件app下载
  16. 今日头条赚钱是真的吗,今日头条赚钱规则是什么
  17. Python学习笔记--day10函数入门
  18. QT中的视频显示优化
  19. 6-3 计算Fibonacci数列每一项时所需的递归调用次数 (10 分)
  20. 在ArcEngine中创建带高程Z值的点和线图层

热门文章

  1. oracle多表关联多字段update
  2. win10计算机怎么拨号上网,宽带拨号,教您win10系统宽带拨号上网的教程
  3. LS1021A 调试问题记录
  4. 使用火车头采集器的时候往文本之中均匀的插入图片
  5. AE 学习笔记(一)
  6. 2020年强烈推荐 ,小友必须要看面经的面试题!!
  7. Java面向对象综合训练综合练习
  8. 听秋夜虫鸣,与自己对话
  9. 【手游服务端】梦幻西游十五门派端+教程+GM物品后台
  10. [转]libsvm介绍及使用