算法(TS):删除链表的倒数第N个节点

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

提示:

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

进阶:你能尝试使用一趟扫描实现吗?

解法

定义两个指针,fast 和 low,fast 先走 n 步,之后 low 和 fast 每一次都各走一步,直到 fast.next 为null,此时 删除 low 的下一个节点就是该删除的。这里要特殊处理删除头节点

vbscript 复制代码
/**
 * Definition for singly-linked list.
 * class ListNode {
 *     val: number
 *     next: ListNode | null
 *     constructor(val?: number, next?: ListNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.next = (next===undefined ? null : next)
 *     }
 * }
 */

function removeNthFromEnd(head: ListNode | null, n: number): ListNode | null {
    if (head === null) return null

    let fast = head
    let low = null

    let i = 1

    while(i < n) {
        fast = fast.next
        i++
    }

    if (fast && fast.next) {
        while(fast.next) {
            fast = fast.next
            low = low ? low.next: head
        }
        // 删除 low 的下一个
        low.next = low.next.next
        return head
    } else { // 删除第一个节点
        return head.next
    }
};

时间复杂度O(n),空间负责度O(1)

相关推荐
颜酱21 分钟前
图结构完全解析:从基础概念到遍历实现
javascript·后端·算法
m0_7369191033 分钟前
C++代码风格检查工具
开发语言·c++·算法
yugi98783835 分钟前
基于MATLAB强化学习的单智能体与多智能体路径规划算法
算法·matlab
DuHz1 小时前
超宽带脉冲无线电(Ultra Wideband Impulse Radio, UWB)简介
论文阅读·算法·汽车·信息与通信·信号处理
失忆爆表症1 小时前
05_UI 组件库集成指南:Shadcn/ui + Tailwind CSS v4
前端·css·ui
小迷糊的学习记录1 小时前
Vuex 与 pinia
前端·javascript·vue.js
发现一只大呆瓜1 小时前
前端性能优化:图片懒加载的三种手写方案
前端·javascript·面试
Polaris北极星少女1 小时前
TRSV优化2
算法
不爱吃糖的程序媛1 小时前
Flutter 与 OpenHarmony 通信:Flutter Channel 使用指南
前端·javascript·flutter
利刃大大1 小时前
【Vue】Element-Plus快速入门 && Form && Card && Table && Tree && Dialog && Menu
前端·javascript·vue.js·element-plus