Skip to main content

删除链表的倒数第N个节点

题目

给定一个链表, 删除链表的倒数第 n 个节点, 并返回修改后的链表的头节点.

提示:
  • 链表中结点的数目为 sz
  • 1 <= sz <= 30
  • 0 <= Node.val <= 100
  • 1 <= n <= sz
示例

输入: 给定一个链表 1 -> 2 -> 3 -> 4 -> 5, n = 2

输出: 1 -> 2 -> 3 -> 5

题解

  1. 先让快指针走到 n 的位置
  2. 如果此时快指针走到头了, 说明倒数第 n 个节点就是第一个节点, 直接用 head.next 删除头节点
  3. 否则在 fastfast.next 都存在的情况下, 让慢指针和快指针同步向前
  4. 当快指针到了最后一个节点, 慢指针也就到了倒数第 n 个节点的前一个节点
  5. 使用 slow.next = slow.next.next 即可删除该节点
  6. 返回 head 即可
note

由于第二次遍历是第一次的延续(第一次是从链头到 n, 第二次是从 n 到链尾), 因此其实就是一趟遍历.

/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @param {number} n
* @return {ListNode}
*/
var removeNthFromEnd = function (head, n) {
let fast = head
let slow = head

// 先让快指针走到 n 的位置
while (n--) {
fast = fast.next
}

if (fast === null) {
// 如果此时快指针走到头了
// 说明倒数第 n 个节点就是第一个节点, 那么删除头节点相当于直接返回 head.next 即可
return head.next
}

// 让慢指针和快指针同步向前
while (fast !== null && fast.next !== null) {
fast = fast.next
slow = slow.next
}

// slow.next 就是倒数第 n 个节点, 删除它
slow.next = slow.next.next

return head
}