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 <= 30
0 <= Node.val <= 100
1 <= 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)