开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情
题目: 给你一个链表,删除链表的倒数第 n **个结点,并且返回链表的头结点。
示例 1:
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
🙇♂️ 感想: 题目要求删除链表中的倒数第n个结点。一开始我想的是每次指针向前移动一位,就判断下n个next是否为空,如果为空,当前的结点的后续结点就是需要删除的节点。这样思考的话思路就有点复杂,而且时间复杂度也很高,因为每移动一位则需要来一次遍历n个结点之间最后的next值是否是空, 或者当前值是空。 还要分情况考虑如果当前节点是空的话要删除当前节点,否则是删除下一个后续节点。 参考别人的思路可以是先遍历一遍列表拿到链表的长度L,然后循环到(L - n ) 的下标将值删除。或者使用快慢指针。本题我给出快慢指针的思路,因为我一开始的想法如果想得清晰一点,我应该可以想到使用快慢指针的方式。
🙇♂️ 解题思路: 快慢指针的思路就是先让快指针走n步, 如果n.next是空,则是删除头结点。否则快指针再向前走一步(这样是可以确保,之后慢指针的后继节点才是需要删除的节点),然后进入循环,快慢指针每次都前进一步,直到快指针指向空,则删除慢指针的后继节点即可。
function removeNthFromEnd(head: ListNode | null, n: number): ListNode | null {
if (!head || !head.next) return null
let link = head
let fast = head, slow = head
let index = 0
while (index < n) {
fast = fast.next
index++
}
if (!fast) {
return head.next
}
fast = fast.next
while (fast) {
fast = fast.next
slow = slow.next
}
slow.next = slow.next.next
return link
}