解题思路
- 暴力法 先遍历一遍链表获取链表的size , size - n 得到的就是 应删除节点的前置节点 , 如若这个前置节点为0 ,则应该删除头节点, 若不为0 直接删除 size - n 的next 节点
- 快慢指针法 设置快慢指针fast 和slow , fast比slow 先走n个节点,当fast 为0时,slow 正处于 应删节点的前置节点, 我们直接删除 slow节点的 next节点就可以了
1. 暴力法
/*
* @lc app=leetcode.cn id=19 lang=javascript
*
* [19] 删除链表的倒数第N个节点
*/
// @lc code=start
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @param {number} n
* @return {ListNode}
*/
var removeNthFromEnd = function (head, n) {
if (!head.next || !head) return null
let p = head
let size = 0
while (p) {
size++
p = p.next
}
if (n > size) return null
size = size - n
if (size == 0) {
return head.next
}
p = head
while (--size) {
p = p.next
}
const deleteNode = p.next
p.next = deleteNode.next
return head
}
2. 快慢指针法
/*
* @lc app=leetcode.cn id=19 lang=javascript
*
* [19] 删除链表的倒数第N个节点
*/
// @lc code=start
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @param {number} n
* @return {ListNode}
*/
var removeNthFromEnd = function (head, n) {
if (!head.next || !head) return null
let fast = (slow = head)
while (n--) {
fast = fast.next
}
if (!fast) return head.next
while (fast.next) {
fast = fast.next
slow = slow.next
}
const deleteNode = slow.next
slow.next = deleteNode.next
return head
}
// @lc code=end