题干
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
示例 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++;
}
}
}
};