LeetCode第19题:删除链表的倒数第N个节点

178 阅读1分钟

题干

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

img

示例 1:

输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]

示例 2:

输入:head = [1], n = 1
输出:[]

提示:

链表中结点的数目为

1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz

解法:迭代

首先我们先要计算出链表的长度,然后我们在算出要删除第几位的节点,然后在遍历时再判断我们的节点为第几个,如果符合的话则进行删除操作。其中需要注意的是我们再第一个元素时需要判断进行特殊处理。具体请看下面代码:

执行用时:76 ms, 在所有 JavaScript 提交中击败了97.09%的用户

内存消耗:39.2 MB, 在所有 JavaScript 提交中击败了43.19%的用户

var removeNthFromEnd = function (head, n) {
    let addnum = 0;
    let workNum = head;
    while (workNum != null) {
        addnum++
        workNum = workNum.next;
    }
    // 获取到我们需要删除的下标值
    let targetIndex = addnum - n + 1;
    console.log(targetIndex)
    // 接着我们删除会分三种情况,分别是在开始时中间是(不用考虑结尾,因为n不为0)
    let prev = null;
    let current = head;
    let next = head.next;
    let currentIndex = 1;
    /* 处理删除第一个结点时 */

    /* 处理删除中间结点时 */
    while (current != null) {
        if (targetIndex == 1) {
            if (next == null) {
                return null
            }
            head = next;
            current = head;
            next = current.next;
            return head
        } else {
            if (currentIndex == targetIndex) {
                prev.next = next
                return head
            } else {
                prev = current;
                current = current.next;
                next = current.next;
                currentIndex++;
            }

        }
    }
};