leetcode每日一题 - 19. 删除链表的倒数第 N 个结点
题解
快慢指针
1、设置虚拟节点 dummyHead 指向 head
2、设定双指针 p 和 q,初始都指向虚拟节点 dummyHead
3、移动 q,直到 p 与 q 之间相隔的元素个数为 n
4、同时移动 p 与 q,直到 q 指向的为 NULL
5、将 p 的下一个节点指向下下个节点
贴出代码
function removeNthFromEnd(head: ListNode | null, n: number): ListNode | null {
// 这道题用双指针的做法
// 创建dumy并添加到链表头部
let dummy = new ListNode()
dummy.next = head
// 创建快慢双指针(n2要比n1提前n个针位) // n2比n1多n个身位,但是我们要的是n1的前一位
let n1 = dummy
let n2 = dummy
for (let i = 0; i <= n; i++) {
n2 = n2.next!
}
while (n2 !== null) {
n1 = n1.next!
n2 = n2.next!
}
n1.next = n1.next!.next
return dummy.next
}