Given a linked list, remove the nth node from the end of list and return its head.
For example,
Given linked list: 1->2->3->4->5, and n = 2.
After removing the second node from the end, the linked list becomes 1->2->3->5.
Note:
Given n will always be valid.
Try to do this in one pass.
这题也是携程18年暑假实习生的笔试题。
最开始想的解法就是,先循环求链表的长度,再用长度-n,再循环一次就能移除该结点。结果对的,但是超时了。代码如下:
/**
* 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 start = new ListNode(null);
start.next = head;
let len = 0,
current = null,
del = null;
if(head === null){
len = 0;
}else{
current = head;
len = 1;
while(current.next){
len++;
}
}
let position = len - n;
if(position > -1 && position < len){
current = head;
let previous,
index = 0;
// 移除第一项
if(position === 0){
head = current.next;
}else{
while(index < position){
previous = current;
current = current.next;
index++;
}
del = current;
previous.next = current.next;
}
len--;
return start.next;
}else{
return null;
}
};
后来看了别人的最佳解法,觉得自己太蠢了。
最佳解法:用两个指针,第一个指针slow的next指向第一个节点,第二个指针fast指向第n+1个结点,然后两个指针同时后移,直到fast指针指向null,这个时候slow指针指向要删除结点的前一个节点,使用slow.next = slow.next.next删除结点。再返回整个链表。代码如下:
/**
* 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) {
var start = new ListNode(null);
start.next = head;
let slow = start,
fast = head;
slow.next = head;
if(head.next === null){
return null
}
for(var i = 0; i < n; i++){
fast = fast.next;
}
while(fast !== null){
slow = slow.next;
fast = fast.next;
}
slow.next = slow.next.next;
return start.next;
};
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。