题目

方法一:两次while循环,第一次查询链表的长度,第二次将倒数第n个节点删除。

var removeNthFromEnd = function(head, n) {
  let cur = head;
  let idx = 0;
  while(cur){
    idx++;
    cur = cur.next;
  }
  if(idx===n)return head.next;
  idx-=n;
  let idx2 = 0;
  cur = head;
  while(idx2!==idx-1){
    idx2++;
    cur = cur.next;
  }
  cur.next = cur.next.next;
  return head;
};

方法二:使用栈,将所有节点添加到栈中,然后找到第n+1个离栈的节点,让该节点后面的节点删除。

var removeNthFromEnd = function(head, n) {
  let cur = head;
  let stack = [];
  while(cur){
    stack.push(cur);
    cur = cur.next;
  }
  if(stack.length === n)return head.next;
  let pop = null;
  for(let i=0;i<n+1;i++){
    pop = stack.pop();
  }
  pop.next = pop.next.next;
  return head;
};