Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
删除链表的倒数第 N 个结点
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
示例 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]
提示:
- 链表中结点的数目为
sz 1 <= sz <= 300 <= Node.val <= 1001 <= n <= sz
思路分析
方法一
- 计算链表的长度;
- 遍历数组,在
i < size - n + 1条件满足时,结束循环; - 为了跳过倒数第
n项,使得curr.next = curr.next.next。
方法二
- 让前后指针
prev和current相差为n后同时向后; - 那么我们可以得到当
current到达终点,即prev.next为null时,current恰好到达倒数第n项的前一项; - 连接倒数第
n项的前后项。
AC 代码
方法一
/**
* 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 res = new ListNode(0, head);
let size = 0
let current = head
while (current != null) {
++size
current = current.next
}
let curr = res
for(let i = 1; i < size - n + 1; i++) {
curr = curr.next
}
curr.next = curr.next.next
console.log(res)
return res.next
};
结果:
- 执行结果: 通过
- 执行用时:76 ms, 在所有 JavaScript 提交中击败了26.57%的用户
- 内存消耗:43.2 MB, 在所有 JavaScript 提交中击败了5.00%的用户
- 通过测试用例:208 / 208
方法二
/**
* 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) {
const res = new ListNode(0, head)
let prev = res
let current = res
while (n--) {
prev = prev.next
}
while (prev.next) {
prev = prev.next
current = current.next
}
current.next = current.next.next
return res.next
};
结果:
- 执行结果: 通过
- 执行用时:60 ms, 在所有 JavaScript 提交中击败了87.04%的用户
- 内存消耗:41.6 MB, 在所有 JavaScript 提交中击败了30.82%的用户
- 通过测试用例:208 / 208