Skip to content

019. Remove Nth Node From End Of List

难度: Medium

刷题内容

原题连接

  • https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/

内容描述

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

示例:

 给定一个链表: 1->2->3->4->5, 和 n = 2.

 当删除了倒数第二个节点后,链表变为 1->2->3->5.

说明:

给定的 n 保证是有效的。

解题方案

思路 1 **- 时间复杂度: O(N)*- 空间复杂度: O(N)***

转化为数组,通过数组下标来确定删除的节点 代码:

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} n
 * @return {ListNode}
 */
var removeNthFromEnd = function(head, n) {
    if (!head || n === 0) {
        return head;
    }
    const list = [];
    let cur = head;
    while (cur) {
        list.push(cur);
        cur = cur.next;
    }
    const index = list.length - n;

    if (list.length === 1 && n === 1) {
        return null;
    }

    if (index === 0) {
        return list[1]
    } else {
        list[index-1].next = list[index+1];
        return list[0];
    }
};

思路2 **- 时间复杂度: O(N)*- 空间复杂度: O(1)***

使用快慢指针的方式,先让fast走n步,再让slow开始和fast一起走,当fast走完的时候,就是slow走到了正确的位置。

var removeNthFromEnd = function(head, n) {
    if (!head || n === 0) {
        return head;
    }
    let dummy = new ListNode(-1);
    dummy.next = head;
    let fast = dummy;
    let slow = dummy;
    Array.from(({length:n+1})).forEach(() => {
        fast = fast.next;
    })
    while(fast) {
        fast = fast.next;
        slow = slow.next;
    }
    slow.next = slow.next.next;
    return dummy.next;
};


我们一直在努力

apachecn/AiLearning

【布客】中文翻译组