题目
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
解题思路
设定虚拟节点和两个指针(快慢指针,亦或是前后指针),让快指针先走,当走到距离慢指针n个节点时停下,然后快慢指针一起走, 当快指针为空节点时停下,此时:慢指针的下一个节点就是要删除的节点;最后将慢指针的下一个节点指向删除节点的下一个节点即可
/**
* @param {ListNode} head
* @param {number} n
* @return {ListNode}
*/
var removeNthFromEnd = function(head, n) {
// 设置虚拟头节点和快慢节点
const vr_node = new ListNode(0);
vr_node.next = head;
let slow = vr_node;
let fast = vr_node;
//让快节点走到距离开始位置为n个时停止
for(let i = 0; i <= n; i++) {
fast = fast.next;
}
// 快慢一起走,直到快指针为null
while(fast) {
fast = fast.next;
slow = slow.next;
}
// 此时慢指针所在位置的next节点即为要删除节点,最后一步:慢指针跳过要删除的节点
slow.next = slow.next.next;
return vr_node.next;
};