题目:
Given the head of a linked list, remove the nth node from the end of the list and return its head.
Example 1:
Input: head = [1,2,3,4,5], n = 2
Output: [1,2,3,5]
记住!n是指定的是倒数的第几个数
方法一:
遍历二次,一个得链表总长度,找到倒数n+1的节点
方法二:
快慢指针
给了倒数第n个,删除它
其实就是找第n+1个
快慢的步伐怎么确定呢?
当快的比慢的走多 n+1个,当快的走完
慢的刚好到第n+1个
快的就是先从n+1位置开始,后来开始和慢的一样一步一步走
但是如果这样写
for (let i = 0; i < n+1; i++)
会有越界风险
所以要写
for (let i = 0; i < n; i++)
那还要比慢指针快n+1 怎么办呢?
使用保护节点!
let p= new ListNode(0); //定义一个节点
定义一个p.next=head
slow=p;
fast=p;
这样快比慢还是快n+1步
p是不动的,slow要遍历的
最后return p.next
var removeNthFromEnd = function(head, n) {
let p=new ListNode(null);
p.next=head; //保护节点,p不能动
let fast=p;
let slow=p;
for(let i=0; i<n;i++){
fast=fast.next;
}
while(fast.next){ //记住是fast.next不为null,不是fast
fast=fast.next;
slow=slow.next;
}
slow.next=slow.next.next;
return p.next;
};