给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 力扣原文链接
示例 1:
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
示例 2:
输入:head = [1], n = 1
输出:[]
示例 3:
输入:head = [1,2], n = 1
输出:[1]
第一种
这一种是逻辑最简单的一种,先找到链表长度,这样就能得到要删除的链表位置下标(length-n)
var removeNthFromEnd = function (head, n) {
let emptyNode = new ListNode(-1, head);
let len = 0;
let cur = emptyNode;
while (cur && cur.next) (cur = cur.next), len++;
cur = emptyNode;
for (let index = 0; index < len - n; index++) {
cur = cur.next;
}
cur.next = cur.next.next;
return emptyNode.next;
};
第二种是快慢指针 快指针先走n步,慢指针再从head节点开始走,当快指针走到最后一个,慢指针也就走到了被删除的前一个节点
var removeNthFromEnd1 = function (head, n) {
let emptyNode = new ListNode(-1, head);
let slow = emptyNode;
let fast = emptyNode;
let count = 1;
while (fast && fast.next) {
fast = fast.next;
debugger;
if (count > n) {
slow = slow.next;
}
count++;
}
slow.next = slow.next.next;
return emptyNode.next;
};