19. 删除链表的倒数第N个结点


方法一:计算链表长度
var removeNthFromEnd = function(head, n) {
let dummy = new ListNode(0, head);
let length = getLength(head);
let cur = dummy;
for (let i = 1; i <length - n + 1; ++i) {
cur = cur.next;
}
cur.next = cur.next.next;
let ans = dummy.next;
return ans;
};
var getLength = function(head) {
let length = 0;
while (head != null) {
++length;
head = head.next;
}
return length;
};
方法二:栈
function Stack() {
let items = [];
this.push = function (element) {
items.push(element);
};
this.pop = function () {
return items.pop();
};
this.peek = function () {
return items[items.length - 1];
};
};
var removeNthFromEnd = function(head, n) {
let dummy = new ListNode(0, head);
let stack = new Stack();
let cur = dummy;
while (cur != null) {
stack.push(cur);
cur = cur.next;
}
for (let i = 0; i < n; ++i) {
stack.pop();
}
let prev = stack.peek();
prev.next = prev.next.next;
let ans = dummy.next;
return ans;
};
方法三:双指针(快慢指针)
var removeNthFromEnd = function(head, n) {
let dummy = new ListNode(0, head);
let fast = head;
let slow = dummy;
for (let i = 0; i < n; ++i) {
fast = fast.next;
}
while (fast != null) {
fast = fast.next;
slow = slow.next;
}
slow.next = slow.next.next;
let ans = dummy.next;
return ans;
};
方法四:递归
var removeNthFromEnd = function(head, n) {
let dummy = new ListNode(-1);
dummy.next = head;
dfs(dummy, dummy.next, n);
return dummy.next;
};
var dfs = function(prev, cur, n) {
if (cur == null) {
return 1;
}
let idx = dfs(cur, cur.next, n);
if (idx == n) {
prev.next = cur.next;
}
return idx + 1;
}