# 19 删除链表的倒数第 N 个节点

# 题目链接

# 难度:中等

# 思路分析:

快慢指针

数组

#

#

#

#

#

#

#

#

#

#

#

#

#

#

# 代码:

快慢指针

var removeNthFromEnd = function(head, n) {
  const preHead = new ListNode(0);
  preHead.next = head; // 新增虚拟头节点 防止删除第一个节点
  let fast = preHead; // 快指针
  let slow = preHead; // 慢指针
  // 快指针先走N步
  while (n--) {
    fast = fast.next;
  }
  // 快慢一起前进 快指针先停下到结尾了 慢指针的下一个值就是要删除的节点
  while (fast && fast.next) {
    fast = fast.next;
    slow = slow.next;
  }
  // 删除第n个节点
  slow.next = slow.next.next;
  return preHead.next;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

数组: 将节点都添加到数组中 再删除对应的元素 最后按顺序转化成链表

var removeNthFromEnd = function(head, n) {
  const arr = [];
  // 转化成数组
  while (head) {
    arr.push(head.val);
    head = head.next;
  }
  // 要删除节点
  const num = arr.length - n;
  arr.splice(num, 1);
  // 转化成节点
  let preHead = new ListNode(0); // 虚拟头节点用于定位
  let res = preHead;
  arr.forEach((item) => {
    res.next = new ListNode(item); // 连接新节点
    res = res.next; // 连接下一个节点
  });
  return preHead.next;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 鼓励我一下:

觉得还不错的话,给我的项目点个star

# 点个Star支持我一下~

最后更新时间: 7/2/2020, 4:27:35 PM