LeetCode 算法入门 — 删除链表的倒数第 N 个结点

92 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

删除链表的倒数第 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]

提示:

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

思路分析

方法一

  1. 计算链表的长度;
  2. 遍历数组,在 i < size - n + 1 条件满足时,结束循环;
  3. 为了跳过倒数第 n 项,使得 curr.next = curr.next.next

方法二

  1. 让前后指针 prevcurrent 相差为 n 后同时向后;
  2. 那么我们可以得到当 current 到达终点,即 prev.nextnull 时,current 恰好到达倒数第 n 项的前一项;
  3. 连接倒数第 n 项的前后项。

AC 代码

方法一

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} n
 * @return {ListNode}
 */
var removeNthFromEnd = function(head, n) {
   let res = new ListNode(0, head);
    let size = 0
    let current = head
    while (current != null) {
        ++size
        current = current.next
    }
    let curr = res
    for(let i = 1; i < size - n + 1; i++) {
        curr = curr.next
    }
    curr.next = curr.next.next
    console.log(res)
    return res.next
};

结果:

  • 执行结果: 通过
  • 执行用时:76 ms, 在所有 JavaScript 提交中击败了26.57%的用户
  • 内存消耗:43.2 MB, 在所有 JavaScript 提交中击败了5.00%的用户
  • 通过测试用例:208 / 208

方法二

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} n
 * @return {ListNode}
 */
var removeNthFromEnd = function(head, n) {
   const res = new ListNode(0, head)
    let prev = res
    let current = res
    while (n--) {
        prev = prev.next
    }
    while (prev.next) {
        prev = prev.next
        current = current.next
    }
    current.next = current.next.next
    return res.next
};

结果:

  • 执行结果: 通过
  • 执行用时:60 ms, 在所有 JavaScript 提交中击败了87.04%的用户
  • 内存消耗:41.6 MB, 在所有 JavaScript 提交中击败了30.82%的用户
  • 通过测试用例:208 / 208

END