「这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战」
题目:
19. 删除链表的倒数第 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
进阶: 你能尝试使用一趟扫描实现吗?
思路:
- 使用双指针, 定义快指针
fast和慢指针slow; - 先让快指针走
n步, 然后两根指针齐头并进。快指针走到终点时, 慢指针所在的位置就是倒数第n个节点; - 这时候我们只需要让满指针的节点跳过下一个节点,指向下下个节点,即可删除指定元素;
- 这道题有边界问题,如果删除的是头节点,快指针
fast根本不会走,这时候直接返回head.next即可。
实现:
/**
* 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 fast = head;
// 倒数的节点, 我们先派个快指针走n步
while (n > 0) {
fast = fast.next;
n--;
}
// 如果删除的是头节点
if (!fast) {
return head.next;
}
let cur = head;
// 不然就走常规逻辑
while (fast.next) {
fast = fast.next;
cur = cur.next;
}
cur.next = cur.next.next;
return head;
};
看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。