# 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支持我一下~