【LeetCode】19. 删除链表的倒数第 N 个结点 (JavaScript)

原题

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

示例 1:

【LeetCode】19. 删除链表的倒数第 N 个结点 (JavaScript)_第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]

题解

  • 方法一:快慢指针
    • 快指针指遍历链表,当快指针走完链表最后一个时,慢指针指向目标
/**
 * 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 slow = head; // 慢指针
    let fast = head; // 快指针
    for(let i = 0; i < n; i++) { // 快指针先走 n 步
        fast = fast.next;
    }
    // 如果慢指针已经达到链表终点,当前快指针即要删除的那一个
    if(!fast) { 
        return head.next;
    }
    // 遍历
    while(fast.next) {
        fast = fast.next;
        slow = slow.next;
    }
    // 快指针下一个走完链表,即慢指针下一个指向需要删除
    slow.next = slow.next.next; // 改变指针指向
    return head;
};
  • 方法二:暴力
    • 将链表转换为数组,使用 splice 删除对应元素
    • 将新数组转换为链表
/**
 * 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 arr = [];
    while(head) { // 将链表中的数据记入数组
        arr.push(head.val); 
        head = head.next;
    }
    let len = arr.length;
    arr.splice(len - n, 1); // 删除倒数第 n 个数

    let newList = new ListNode();
    let p = newList; // 使 p 指向链表头结点地址
    // 将处理完成的数组记入链表
    for(let i = 0; i < arr.length; i++) {
        p.next = new ListNode(arr[i]);
        p = p.next;
    }
    return newList.next; // 头结点没有记录数据
};

你可能感兴趣的:(LeetCode,链表,leetcode,javascript,算法)