LeetCode19.删除链表的倒数第N个节点

2023-09-18 22:50:18

 我先用的第一种方法,先第一次遍历算出有节点数num,然后第二次遍历找到第num-n个节点,删除它的下一个节点,也就是第num-n节点.next = num-n节点.next.next(),然后需要注意的是找到第num-n个节点,指针需要从头节点移动num-n-1次,但是后来一直报空指针异常,我反复的检查,一步一步自己推,死活想不到,后来我直接把头节点的下一个删掉看看返回什么,才发现,示例中有一个只有一个节点的链表需要删除头节点,这样.next = .next.next当然就报错了,于是我把删除头节点的情况单独拿出来了,这是第一种方法的代码:

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) { 
          ListNode h1 = head;
          ListNode h2 = head;
          int num =0;
          while(h1 != null){
              num++;
              h1=h1.next;
          }
          if(num == n){
            return head.next;
          }else{
            while(num - n-1 !=0){
              h2 = h2.next;
              num--;
            }
            h2.next = h2.next.next;
          }
          return head;
    }
}

 我记得我之前在剑指offer里面做过一道相同的题剑指offer22.链表中的倒数第k个节点_荔枝味啊~的博客-CSDN博客,我用的是双指针,就是第一个指针先走n步,然后第二个指针和第一个指针一起完后移动,当第一个指针为空的时候,第二个指针的位置就是要删除的节点,然后写了如下代码:

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) { 
          ListNode h1 = head;
          ListNode h2 = head;
          if(h1.next == null)return head.next;
          while(n!=0){
            h1 = h1.next;
            n--;
          }
            h1 = h1.next;   
          while(h1 != null){
            h1 = h1.next;
            h2 = h2.next;
          }
            h2.next= h2.next.next;
          return head;     
    }
}

三个示例过了但是我无法解决删除头节点的问题,于是就看题解了,题解是先创建了一个节点然后这个节点的下一个节点是头节点(其实我都没看到题目中有这个参数是val和next的构造方法),这样就很容易用.next = .next.next删除头节点了,这是题解代码和题目给出的ListNode的数据结构:

/**
 * 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 dummy = new ListNode(0, head);
        ListNode first = head;
        ListNode second = dummy;
        for (int i = 0; i < n; ++i) {
            first = first.next;
        }
        while (first != null) {
            first = first.next;
            second = second.next;
        }
        second.next = second.next.next;
        ListNode ans = dummy.next;
        return ans;
    }
}

更多推荐

vue-cli安装与搭建SPA项目

文章目录一、VueCLI1.1脚手架1.2VueCLI1.3安装VueCLI二、用CLI完成spa项目的构建2.1使用脚手架创建项目骨架2.2“一问一答”模式2.3安装项目所需nmp2.4项目结构简介三、基于spa项目完成路由3.1自定义组件3.2创建路由集合3.3挂载四、嵌套路由4.1创建组件4.2创建路由集合4.3

插入/希尔/选择/堆/冒泡/快速/归并/计数排序 && 排序原理 && 搜索树原理 && 哈希概念

第1题(编程题)题目名称:插入排序和希尔排序题目内容://插入排序publicstaticvoidinsertSort(int[]array){//writecodehere}//希尔排序publicstaticvoidshellSort(int[]array){//writecodehere}第2题(编程题)题目名称

关于远程工作的面试可能存在的陷阱

附上看到的完整帖子地址:面试POPER的后端开发工程师的离奇经历分享一下我遇到过的,我至少面试过10个远程工作,其中有3个的面试是直接让我完成一个需求的,前两次都耐心做了,第3次看到相同要求时我都懒得回复了,直接视为白嫖了。可能很多企业会反驳你这只是测试,可这就是CRUD而已,能考验什么?对某个框架、库、SDK的使用熟

发布文章到wordpress

给朋友新建的wp网站,没有内容怎么办,总不能一篇篇的挨个写入吧。用wp提供的录入模块就可以了参考wp说明文档获取docx内容保存到wp资料有个docx文件,但文件格式混乱,好在有目录,可以基于目录,对文章分割,用正则拆分存入wp首先用pandoc把docx转为md文件,速度较慢,且没有进度展示,稍等pandoc-fdo

[maven] 使用 Nexus 管理 repository

[maven]使用Nexus管理repository大概是说还有一篇笔记,两篇内容,maven的内容就差不多过完了。这一篇笔记主要记一下maven的central管理部分,之前提到过我们公司用的就是nexux做了一个镜像,这里也会用docker去创建一个本地的nexus三合一的话内容就拆得太长了……所以这里nexus的

ARM64 SMP多核启动详解1(spin_table)

1.简介处理器架构:arm64uboot版本:uboot-2023内核源码:linux-5.10ubuntu版本:20.04.1一般嵌入式系统使用的都是对称多处理器(SymmetricMulti-Processor,SMP)系统,包含了多个cpu,这几个cpu都是相同的处理器,如4核Contex-A53。但是在系统启动

【MySQL 45讲笔记】

文章目录第一讲:一条SQL查询语句是如何执行的?第二讲:一条SQL更新语句是如何执行的?第三讲:事务隔离,为什么你改了我还看不见第四讲:深入浅出索引(上)第五讲:深入浅出索引(下)第六讲:全局锁和表锁,给表加个字段怎么有这么多阻碍?第七讲:行锁功过,怎么减少行锁对性能的影响?第八讲:事务到底是隔离的还是不隔离的?第九讲

详解JAVA远程debug

目录1.什么是远程debug?2.远程debug普通JAVA程序环境测试程序程序启动指令编译器配置3.远程debugJAVAWeb程序4.远程debugspringboot程序1.什么是远程debug?远程debug,也就是可以在本地debug远端部署的程序,这对于定位远端环境中的问题非常有用,之所以我们说是远端环境,

AT APDU

AT+CCHO是一个AT指令,用于在你的SIM卡应用程序中打开一个逻辑通道。这个命令让TE返回一个由UICC分配的逻辑通道。UICC将开启一个新的通道,选择由dfname标识的应用。然后你可以使用AT+CGLA命令将APDU发送到应用程序,最后使用AT+CCHC命令关闭到应用程序的通道。这意味着你需要编写一个SIM卡应

文件内容显示

一.浏览普通文件.1.文件内容查看1.1.1.cat命令作用:查看文件内容,适合数据量较少格式:cat-参数文件名参数:-n:显示行号,加上-b:文件中所有非空行增加行号,编号从1开始例:查看主机域名映射文件:[root@server~]#cat/etc/hosts127.0.0.1为回环地址::1为IPV6格式扩展:

【2023,学点儿新Java-48】变量与运算符 (阶段性复习):关键字和保留,回顾:标识符的命名规则,变量的基本使用

前情提要:【2023,学点儿新Java-47】常见字符集介绍:ASCII码、ISO-8859-1字符集、GBxxx字符集、Unicode码的缺陷、UTF-8|补充:条件运算符的练习【2023,学点儿新Java-46】条件运算符:语法格式及示例;基础练习:获取两个数/三个数中的较大值;星期运算|附:测试代码位运算符的使用

热文推荐