首页 > 编程语言 >Leetcode 19. 删除链表的倒数第N个结点(Remove nth node from end of list)

Leetcode 19. 删除链表的倒数第N个结点(Remove nth node from end of list)

时间:2023-08-16 23:44:39浏览次数:54  
标签:node dummy head right ListNode next 链表 end

题目链接

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

示例 1:

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

示例 2:

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

提示:

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

思路

暴力解法: 可以先用循环遍历一次链表,获取长度. 再次循环使指针指向要删除的节点的前一个节点进行删除.
双指针法: 创建快指针(right)和慢指针(left), 首先使快指针移动n + 1步, 再让两个指针同时移动, 直到right == null, 此时慢指针指向的就是要删除的节点的前一个节点.

代码实现

暴力解法:

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        int length = getLength(head);
        ListNode dummy = new ListNode(-1, head);
        ListNode current = dummy;

        for(int i = 0; i < length - n; i++) {
            current = current.next;
        }

        current.next = current.next.next;
        return dummy.next;

    }

    public int getLength(ListNode head) {
        int length = 0;
        while(head != null) {
            head = head.next;
            length++;
        }

        return length;
    }
}

双指针法:

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dummy = new ListNode(-1, head);
        ListNode left = dummy;
        ListNode right = dummy;

        for(int i = 0; i < n; i++) {
            right = right.next;
        }

        while(right.next != null) {
            right = right.next;
            left = left.next;
        }

        left.next = left.next.next;
        return dummy.next;
    }
}

标签:node,dummy,head,right,ListNode,next,链表,end
From: https://www.cnblogs.com/ahci316/p/17636501.html

相关文章

  • 顺序表与链表
    顺序表与链表前言  基础数据结构的学习主要包括两个部分,即【结构定义】与【结构操作】。顾名思义,结构定义就是定义某种或多种性质,再通过相关的结构操作去维护这种性质。对于初学者来说数据结构的学习不能抽象的理解,还需要结合动态的、可视化的工具去理解。下面给出美国旧金山......
  • class<T extends interface> 或 class<T extends abstract class>
    packagecom.java3y.austin.test;abstractclassA{publicabstractvoidtest();}classBextendsA{B(){System.out.println("B的构造函数");}@Overridepublicvoidtest(){System.out.println("B的test函数"......
  • rockchip平台关闭硬件加速 vendor.hwc.compose_policy
    修改位置:device/rockchip/rk356x/device.mk:114:        vendor.hwc.compose_policy=1\这个值是在/hardware/rockchip/hwcomposer/drmhwc2/rockchip/platform/rk3588/drmvop3588.cpp:2923:intiMode=hwc_get_int_property("vendor.hwc.compose_policy",&qu......
  • 什么是 Node.js 的 cross-env 工具包
    cross-env是一个运行在Node.js环境中的工具包,它的主要作用是让我们可以在命令行中设置环境变量,而不必担心跨操作系统的兼容问题。在Unix和Windows系统中设置环境变量的方式是不同的,这就导致了我们无法写出一条在所有操作系统中都可以运行的设置环境变量的命令。cross-env......
  • 《安富莱嵌入式周报》第320期:键盘敲击声解码, 军工级boot设计,开源CNC运动控制器,C语言
    周报汇总地址:http://www.armbbs.cn/forum.php?mod=forumdisplay&fid=12&filter=typeid&typeid=104 视频版:https://www.bilibili.com/video/BV1Cr4y1d7Mp/1、键盘敲击声解码https://arxiv.org/abs/2308.01074键盘敲击声被解码的话,我们使用键盘输入密码将被方便的解码出......
  • 4.1 C++ STL 动态链表容器
    List和SList都是C++STL中的容器,都是基于双向链表实现的,可以存储可重复元素的特点。其中,List内部的节点结构包含两个指针一个指向前一个节点,一个指向后一个节点,而SList只有一个指针指向后一个节点,因此相对来说更节省存储空间,但不支持反向遍历,同时也没有List的排序功能。双向链表的......
  • 4.1 C++ STL 动态链表容器
    List和SList都是C++STL中的容器,都是基于双向链表实现的,可以存储可重复元素的特点。其中,List内部的节点结构包含两个指针一个指向前一个节点,一个指向后一个节点,而SList只有一个指针指向后一个节点,因此相对来说更节省存储空间,但不支持反向遍历,同时也没有List的排序功能。双向链表......
  • [Vue warn]: Runtime directive used on component with non-element root node. The
    原因意思是自定义指令不能放到组件上,而是要放到自有的元素上,也就是这里用到的v-dialogDrag不能放在自定义组件上上图的v-dialogDrag指令用在了自定义组件el-dialog身上,就警告了解决外面套一层不是自定义组件的东东就可以,比如套了一层div......
  • Cannot read properties of undefined (reading 'nodeName')解释
     jquery.min.js:2UncaughtTypeError:Cannotreadpropertiesofundefined(reading'nodeName')解释 这个错误通常发生在尝试访问或操作一个undefined或null值的属性时。错误消息"Cannotreadpropertiesofundefined(reading'nodeName')"意味着在代码中的某个......
  • LeetCode -- 19. 删除链表的倒数第 N 个结点
     一般的删除问题,可以直接删除(找符合条件的,找到了直接删掉),延迟删除(打标记,找完了再删除),栈,双指针 在链表中删除一个节点,要找到其前面一个节点cur,然后cur->next=cur->next->next即可 方法一:直接删除我们先算出链表长度len,要删除倒第n个节点就是删除第len-n......