给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5.
先遍历一次链表,求出链表的长度,然后再用链表长度减去n,如果为0,则是删除第一个节点,否则找到链表要删除节点的前一个节点,让它的next等于要删除节点的next
var removeNthFromEnd = function(head, n) {
let prev={}
prev.next=head;
var count=1;
var curr=head;
while(curr&&curr.next){
curr=curr.next;
count++;
}
let i=count-n;
if(i==0)return head.next;
var del=head;
var s=0;
while(s<i-1){
del=del.next;
s++;
}
del.next=del.next.next;
return prev.next;
};
也可以使用快慢指针,即先让快指针走n项,然后快慢指针一起走,当快指针走到末尾时,慢指针刚好走到需要删除项的前一项
然后删除即可
var removeNthFromEnd = function(head, n) {
let prev={}
prev.next=head;
let lazy=prev;
let fast=head;
if(!head.next)return head.next;
var i=1;
while(i<n){
fast=fast.next;
i++;
}
while(fast&&fast.next){
fast=fast.next;
lazy=lazy.next;
}
lazy.next=lazy.next.next;
return prev.next;
};