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

day15 leetcode-hot100-29(链表8)

19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)

1.暴力法

思路

(1)先获取链表的长度L

(2)然后再次遍历链表到L-n的位置,直接让该指针的节点指向下下一个即可。

2.哈希表

思路

(1)将链表中所有节点都加入到哈希表中,其中哈希表的格式为HashMap<Integer,ListNode>,前面表示节点的位置,后面是节点。

(2)根据(1)可以知道链表的总长度nums,倒数第n个节点的位置为del=nums-n+1;

(3)然后取出del-1与del+1位置的节点,让del-1的下一个节点为del+1即可。

ps:需要考虑被删除的节点是否开头节点或者结尾节点。开头直接下一个,结尾直接del-1指向null即可。

具体代码
/*** 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 init = head;HashMap<Integer,ListNode> map =new HashMap<>();int count=0;while(head!=null){map.put(++count,head);head=head.next;}int nums=count;int del=nums-n+1;if(del==1){return init.next;}if(del==nums){if(nums==1){return new ListNode();}else{ListNode p1 = map.get(del-1);p1.next=null;return init;}}ListNode p1 = map.get(del-1);ListNode p2 = map.get(del+1);p1.next=p2;return init;}
}

3.栈

思路

(1)将全部节点入栈。

(2)然后用for循环弹出去n个节点,然后让最后的节点的next等于next.next

ps:初始化的时候设置一个空节点指向head,防止全部弹出去后next.next报错.

具体代码
/*** 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 init = new ListNode(0,head);Deque<ListNode> stack = new LinkedList<ListNode>();ListNode cur = init;while(cur!=null){stack.push(cur);cur=cur.next;}for(int i=0;i<n;i++){stack.pop();}ListNode n1 = stack.peek();n1.next=n1.next.next;return init.next;}
}

4.双指针

思路

设计快慢指针,其中快指针比慢指针多走n次,等快指针到null的时候,慢指针所在的位置就是要弹出的位置的前一个

ps:(1)其实多走了n+1步,因为需要慢指针走到要弹出位置的前一个节点。

(2)慢指针是0节点并指向第一个节点head,快指针一开始就指向head,这样就算长度为1的链表,slow慢指针的next.next也不会报错,否则出现空指针异常。

具体代码
/*** 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 init = new ListNode(0,head);ListNode fast = head;ListNode slow = init;for(int i=0;i<n;i++){fast=fast.next;}while(fast!=null){fast=fast.next;slow=slow.next;}slow.next=slow.next.next;return init.next;}
}

http://www.xdnf.cn/news/10247.html

相关文章:

  • KWIC—Implicit Invocation
  • Redis实战-基于redis和lua脚本实现分布式锁以及Redission源码解析【万字长文】
  • 【android bluetooth 案例分析 04】【Carplay 详解 2】【Carplay 连接之手机主动连车机】
  • 【android bluetooth 案例分析 04】【Carplay 详解 3】【Carplay 连接之车机主动连手机】
  • K 值选对,准确率翻倍:KNN 算法调参的黄金法则
  • 当前用户的Git本地配置情况:git config --local --list
  • Python Day38 学习
  • 2025山东CCPC题解
  • Fragment事务commit与commitNow区别
  • 使用HTTPS进行传输加密
  • 每日Prompt:隐形人
  • Vue 核心技术与实战day07
  • Java多线程并发常见问题与解决方案
  • vue2源码解析——响应式原理
  • Linux【工具 04】Java等常用工具的多版本管理工具SDKMAN安装使用实例
  • 华为OD机试真题—— 最少数量线段覆盖/多线段数据压缩(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
  • 【算法】动态规划
  • 【Dv3Admin】工具分页配置文件解析
  • 姜老师的MBTI课程:MBTI是可以转变的
  • Java代码重构:如何提升项目的可维护性和扩展性?
  • Linux.docker.k8s基础概念
  • 【设计模式-4.5】行为型——迭代器模式
  • 自定义载板RK3588HDMI输入配置完整解决方案
  • Catch That Cow POJ - 3278
  • fdw批量导入外部表
  • 7.CircuitBreaker断路器
  • 【js逆向】某某省过验证码逆向
  • hantools 常用函数
  • 第二代IndoorLink头戴式无线讲解器,远距+动感,更好用了
  • 数据交易场景的数据质量评估