# 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
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 鼓励我一下:
觉得还不错的话,给我的项目点个star吧