题目:
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
核心思路: 方法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;
};