算法(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)

相关推荐
All for pursuit.9 分钟前
【分治-3】347.前K个高频元素
数据结构·c++·算法·leetcode
研☆香15 分钟前
jQuery + Swiper.js 实现动态渲染轮播图
前端·javascript·jquery
索尔~古德曼28 分钟前
CF(1400-1400&1300-1500)错题集
算法
子兮曰39 分钟前
Node.js 50个优势场景盘点:一个人单干,为啥我多数时候只用它
前端·后端
IT_陈寒39 分钟前
我花3小时debug,就因为JavaScript这个隐式转换坑
前端·人工智能·后端
excel1 小时前
Nuxt 中 useSeoMeta 与 useHead 的区别
前端
竹林8181 小时前
OmniGame 技术白皮书:从零依赖到 WebRTC P2P,重新定义网页小游戏的工程上限
前端·浏览器
ss2731 小时前
AI全栈实战 | 2.1-02 CSS 布局:垂直居中为什么是经典面试题?所有布局在解决什么矛盾
前端·css
律宏阔1 小时前
Flutter Riverpod 3:统一打印 Provider 错误与自动重试日志
前端·flutter
周洲08302 小时前
STM32片内Flash读写深度详解|掉电参数保存、底层原理
linux·前端·stm32