解题思路
- 暴力法 先遍历一遍链表获取链表的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