链表 - 删除链表的倒数第N个结点

45 阅读1分钟

19. 删除链表的倒数第N个结点

image.png

image.png

方法一:计算链表长度

/**
 * @param {ListNode} head
 * @param {number} n
 * @return {ListNode}
 */
var removeNthFromEnd = function(head, n) {
    let dummy = new ListNode(0, head);
    let length = getLength(head);
    let cur = dummy;
    for (let i = 1; i <length - n + 1; ++i) {
        cur = cur.next;
    }
    cur.next = cur.next.next;
    let ans = dummy.next;
    return ans;
};
// 计算链表长度
var getLength = function(head) {
    let length = 0;
    while (head != null) {
        ++length;
        head = head.next;
    }
    return length;
};

方法二:栈

/**
 * @param {ListNode} head
 * @param {number} n
 * @return {ListNode}
 */
// 栈的方法入栈和弹栈
function Stack() {
    let items = [];

    // 向栈添加新元素
    this.push = function (element) {
      items.push(element);
    };

    // 从栈内弹出一个元素
    this.pop = function () {
        return items.pop();
    };
    
    // 返回栈顶的元素
    this.peek = function () {
      return items[items.length - 1];
    };
};

var removeNthFromEnd = function(head, n) {
    let dummy = new ListNode(0, head);
    let stack = new Stack();
    let cur = dummy;
    while (cur != null) {
        stack.push(cur);
        cur = cur.next;
    }
    for (let i = 0; i < n; ++i) {
        stack.pop();
    }
    let prev = stack.peek();
    prev.next = prev.next.next;
    let ans = dummy.next;
    return ans;
};

方法三:双指针(快慢指针)

/**
 * @param {ListNode} head
 * @param {number} n
 * @return {ListNode}
 */

var removeNthFromEnd = function(head, n) {
    let dummy = new ListNode(0, head);
    let fast = head;
    let slow = dummy;
    for (let i = 0; i < n; ++i) {
        fast = fast.next;
    }
    while (fast != null) {
        fast = fast.next;
        slow = slow.next;
    }
    slow.next = slow.next.next;
    let ans = dummy.next;
    return ans;
};

方法四:递归

/**
 * @param {ListNode} head
 * @param {number} n
 * @return {ListNode}
 */

var removeNthFromEnd = function(head, n) {
    let dummy = new ListNode(-1);
    dummy.next = head;

    dfs(dummy, dummy.next, n);

    return dummy.next;
};

var dfs = function(prev, cur, n) {
    if (cur == null) {
        return 1;
    }
    let idx = dfs(cur, cur.next, n);
    if (idx == n) {
        prev.next = cur.next;
    }
    return idx + 1;
}