给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
解题思路
- 设置哨兵指针 prev ,cur 指针遍历链表
- 让 cur 指针先走 n 步后,prev 指针开始走
- 当 cur 指针遍历完成后,删除 prev 指针的下一个节点

代码实现
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @param {number} n
* @return {ListNode}
*/
var removeNthFromEnd = function(head, n) {
let node = new ListNode(0)
node.next = head
// 哨兵指针
let prev = node
// 链表遍历指针
let cur = head
while(cur){
// 当 cur 指针走了 n 步后,prev 指针开始走
if(--n < 0){
prev = prev.next
}
cur = cur.next
}
// cur 指针遍历完成后,prev 的下一个节点即要被删除的节点
prev.next = prev.next.next
return node.next
};