经典快慢双指针。

    可参考下图,思路是一样的,细节可能不太一样。再注意边界问题就好

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

    1. function ListNode(val, next) {
    2. this.val = (val === undefined ? 0 : val)
    3. this.next = (next === undefined ? null : next)
    4. }
    5. var removeNthFromEnd = function (head, n) {
    6. let slow = head, last = n, fast = head
    7. if (!head.next) return null
    8. while (last > 0) {
    9. fast = fast.next
    10. if (!fast) head = head.next
    11. last -= 1
    12. }
    13. while (fast && fast.next) {
    14. fast = fast.next
    15. slow = slow.next
    16. }
    17. slow.next = slow.next.next
    18. return head
    19. };
    20. // ----------------- test case -------------------
    21. var l1 = new ListNode(1), l2 = new ListNode(2), l3 = new ListNode(3), l4 = new ListNode(4), l5 = new ListNode(5);
    22. l1.next = l2
    23. l2.next = l3
    24. l3.next = l4
    25. l4.next = l5
    26. l5.next = null
    27. var h1 = new ListNode(1)
    28. var h2 = new ListNode(2)
    29. var h3 = new ListNode(3)
    30. h1.next = h2
    31. h2.next = h3
    32. const resultHead = removeNthFromEnd(h1, 3)