当前位置: 首页 > news >正文

LeetCode100之删除链表的倒数第N个节点(19)--Java

1.问题描述

        给你一个链表,删除链表的倒数第 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

        难度等级

                中等

        题目链接

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

2.解题思路

        这道题要我们删除链表的倒数第N个结点,它的难点就在于如何找打倒数第N个结点。

        不过这个难点也很容易就可以解决,我们只需要定义前后的两个指针,然后让前指针先走N个节点,这样前后两个指针就相差了N个节点。在这种情况下,如果前后指针同时遍历,当前指针到达链表末尾时,前指针所在节点为倒数第一个节点,后指针所在节点为倒数第(N+1)个节点,要删除的节点就在后指针的下一个节点。

        //定义前后两个指针ListNode front = head;ListNode back = head;

        上面的想法可以解决大部分情况,但是当要删除的节点是头结点时,上面的这种情况就行不通了。假设链表就a个节点,要求我们删除倒数第a个节点,那前指针走不到(a+1)个节点处,没有那么多节点可以走。所以我们可以用一个变量来统计前指针比后指针先走的节点个数,如果小于N,说明要删除的就是头结点,我们直接把头节点删除就好了。

        //让前后两个指针相差n个节点int count = 0;while(count < n && front != null && front.next != null){front = front.next;count++;}//如果count还未等于n就退出//说明要删除的节点是头结点if(count < n){return head.next;}

        如果要删除的不是头结点,那么在前指针先走完N个节点后,前后指针就可以开始行动了,直到前指针到达链表末尾。

        //同时移动前后两个指针,直到前指针到达链表末尾while(front.next != null){front = front.next;back = back.next;}

        前指针到达链表末尾后,后指针也就到达了倒数第(N+1)个节点,直接将后指针的下一个节点指针指向倒数第(N-1)个节点,删除倒数第N个节点即可。

        //走到这一步,后指针的下一个节点就是倒数第n个节点//将它删掉back.next = back.next.next;

        最后将链表的头结点返回。

3.代码展示

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {//定义前后两个指针ListNode front = head;ListNode back = head;//让前后两个指针相差n个节点int count = 0;while(count < n && front != null && front.next != null){front = front.next;count++;}//如果count还未等于n就退出//说明要删除的节点是头结点if(count < n){return head.next;}//同时移动前后两个指针,直到前指针到达链表末尾while(front.next != null){front = front.next;back = back.next;}//走到这一步,后指针的下一个节点就是倒数第n个节点//将它删掉back.next = back.next.next;//返回头结点return head;}
}

4.总结

        这道题最大的关键就是如何找到倒数第N个节点,只要找到了倒数第N个节点,将它删除这道题也就解决了。这道题就啰嗦到这里,祝大家刷题愉快~


http://www.mrgr.cn/news/75030.html

相关文章:

  • java:继承题练习
  • 微信小程序=》基础=》常见问题=》性能总结
  • gitlab角色、权限
  • 学习threejs,使用第一视角控制器FirstPersonControls控制相机
  • 七牛云上传图片成功,但是无法访问显示{error : document not found}
  • MyBatis从入门到进阶
  • halcon3D gen_image_to_world_plane_map的图像高精度拼接技术
  • 企业风险监控4.0时代,大家都在关心什么问题?这20+个QA为你揭晓!
  • 2024软件测试面试题(持续更新)
  • 38.安卓逆向-壳-smali语法2(条件语句和for循环)
  • CSR 和 SSR 分别是什么?
  • 力扣 LeetCode 459. 重复的子字符串(Day4:字符串)
  • UVa 11288 Carpool
  • 打造专业问答社区:Windows部署Apache Answer结合cpolar实现公网访问
  • Cocos Creator《星际征服者》3D实时对战战机类游戏
  • 基于Springboot+微信小程序的健康饮食小程序 (含源码数据库)
  • 飞牛云fnOS本地部署WordPress个人网站并一键发布公网远程访问
  • 什么?postman 还可以做性能测试?
  • C++的返回值在内存中的传递过程
  • 【微信小程序】关于小程序开发过程中的一些经验之谈,很有用!!
  • StableDiffusion系列教程 |SD提示词编写指南
  • PSRR仿真笔记
  • 37拼购模式后期可能面临的问题及解决方案
  • 数据分析师证书怎么考
  • 后端-实现excel的导出功能(超详细讲解)
  • 海天味业监事交易违规,新任女掌门现管理漏洞