给你一个链表,删除链表的倒数第 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 <= 30

0 <= Node.val <= 100

1 <= n <= sz

**进阶:**你能尝试使用一趟扫描实现吗?

首先想到的是两趟扫描,第一次获取链表长度,第二次获取要删除结点的前缀pre

pre->next = pre->next->next即可

pre需要遍历到 len-n 得到

所以我们先让 i 遍历到 n 之后 pre 与 i 一起遍历,当 i 遍历结束后pre即为所求

同样可以引入虚拟头节点减少判空

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* i = head;
while (n--) {
i = i->next;
}
ListNode* pre = new ListNode(-1, head);
head = pre;
while (i != nullptr) {
pre = pre->next;
i = i->next;
}
pre->next = pre->next->next;
return head->next;
}
};