Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
题目描述
给你一个链表,删除链表的倒数第 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
题解
1.双指针
由于链表是不能通过下标来访问,所以这道题是很经典的一个通过 使用双指针算法中的 快慢指针 来解决的应用,而且比暴力的去解更简单,思路更清晰。
这里有个坑,就是如果 fast 指针在第一次循环后,为 null 的话,我们需要直接返回 head.next 的值。
如果 fast 指针不为空的话,则开始新的循环判断, fast 和 fast.next 是否为空,一直往后查找
最终将 slow.next = slow.next.next 即可删除倒数节点。
下面这里用图进行示意。
-
初始情况下
n=2,意思删除倒数第二个节点
-
第N次
看到 fast.next 为空,则我们的 slow.next = slow.next.next 直接会将倒数第二个节点,直接删除。
const removeNthFromEnd = (head, n) => {
let slow = head
let fast = head
for (let i = 0; i < n; ++i) {
fast = fast.next
}
if (!fast) {
return head.next
}
while (fast && fast.next) {
slow = slow.next
fast = fast.next
}
slow.next = slow.next.next
return head
}
总结
该题目 6 :链表的操作,大部分都会通过 双指针算法 来解答。