题目链接:力扣
题目描述:给定一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
方法一:
思路:第一趟遍历确定整个两边的节点个数num,删除倒数第n个节点,即删除正数第num-n+1个节点。第二趟遍历删除第num-n+1个节点。
代码:
var removeNthFromEnd = function(head, n) {
if(head==null)
return head;
let temp=head;
let num=0;
while(temp!=null){
temp=temp.next;
num++;
}
n=num-n+1;
if(n==1)
return head.next;
temp=head;
num=1;
while(num!==n-1 && temp!==null){
temp=temp.next;
num++;
}
temp.next=temp.next.next;
return head;
}
时间O(n)
方法二:尝试一趟遍历
一趟遍历需要借助额外的空间,将遍历到的节点存储到数组中,最后数组的长度就是节点的个数num,arr[num-n]就是要删除的倒数第n个节点,直接删除即可。
var removeNthFromEnd = function(head, n) {
if(head==null)
return head;
let arr=[];
let temp=head;
while(temp!=null){
arr.push(temp);
temp=temp.next;
}
let num=arr.length;
if(num==n)
return head.next;
if(n==1){
arr[num-2].next=null;
return head;
}
arr[num-n-1].next=arr[num-n+1];
return head;
};
时间O(n),空间O(n)