19. 删除链表的倒数第 N 个结点
1. 题目
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
示例 1:

1  | 输入:head = [1,2,3,4,5], n = 2  | 
示例 2:
1  | 输入:head = [1], n = 1  | 
示例 3:
1  | 输入:head = [1,2], n = 1  | 
提示:
- 链表中结点的数目为 
sz 1 <= sz <= 300 <= Node.val <= 1001 <= n <= sz
进阶:你能尝试使用一趟扫描实现吗?
2. 思路
- 已知题目要求一趟扫描实现删除联表的倒数第n个节点,因此引入哈希表记录每个节点的位置(同时看到
sz的大小最多只有30个,因此哈希表可以直接使用数组进行代替) - 初始化
dummy头指针,返回结果时则可直接返回dummy.next,考虑到可能会删除头节点,因此初始化了dummy节点作为头指针 - 初始化
list节点数组,size为32,预留了一头一尾的空间,因此是30 + 2 - 初始化
node节点用于遍历,同时初始化index用于实时获取节点的下标 - 遍历链表并将节点根据下表
index设置入list节点数组中 - 完成遍历后,可以直接通过
index - n - 1得到倒数第n个节点的前1位,通过index - n + 1得到倒数第n个节点的后1位 - 随后通过
list[index - n - 1].next = list[index - n + 1]即可删除倒数第n个节点 - 将
dummy.next作为结果链表返回 
3. 代码
1  | /**  | 
4. 复杂度
- 时间复杂度:
O(n) - 空间复杂度:
O(n) 
