31. 删除链表的倒数第 N 个结点【LC19】

103 阅读1分钟

题目: 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

image.png

核心思路: 方法1: 最简单的思路,链表拆开,存到数组中,然后剔除指定位置元素,再合并起来。

方法2: 利用快慢指针定位到倒序指定位置的节点。

利用快慢指针,当快指针指向null的时候,慢指针指在指定节点位置。 关键点,初次平移快指针就指向null的情况(1)链表长度小于n,这种返回链表就可以。(2)链表长度等于n,这种去掉链表第一个节点就可以。

解:

var removeNthFromEnd = function (head, n) {
  if (!head) {
    return null
  }
  let cur = head;
  let curAdd2 = cur;

  while (n && curAdd2) {
    curAdd2 = curAdd2.next;
    n--;
  }
  if (!curAdd2 && n) { // list.length < n
    return head;
  }
  if (!curAdd2 && !n) { // list.length == n
    return head.next
  }

  // 利用快慢指针
  let curParent = null;
  while (curAdd2) {
    curParent = cur;
    cur = cur.next;
    curAdd2 = curAdd2.next
  }
  curParent.next = cur.next;
  return head;
};