两种方法:
    1 使用一个指针遍历两次
    第一次用于算出来倒数第N个节点是正数第几个节点
    第二次用于删除节点

    1. /**
    2. * Definition for singly-linked list.
    3. * struct ListNode {
    4. * int val;
    5. * ListNode *next;
    6. * ListNode(int x) : val(x), next(NULL) {}
    7. * };
    8. */
    9. class Solution {
    10. public:
    11. ListNode* removeNthFromEnd(ListNode* head, int n) {
    12. ListNode* headhead = new ListNode(0);
    13. headhead->next = head;
    14. int len = 0;
    15. auto pt = head;
    16. while(pt)
    17. {
    18. len++;
    19. pt = pt->next;
    20. }
    21. int idx = len - n;
    22. pt = headhead;
    23. while(idx--)
    24. {
    25. pt = pt->next;
    26. }
    27. pt->next = pt->next->next;
    28. return headhead->next;
    29. }
    30. };

    第二次写题

    1. /**
    2. * Definition for singly-linked list.
    3. * struct ListNode {
    4. * int val;
    5. * ListNode *next;
    6. * ListNode(int x) : val(x), next(NULL) {}
    7. * };
    8. */
    9. class Solution {
    10. public:
    11. ListNode* removeNthFromEnd(ListNode* head, int n) {
    12. int num = 0;
    13. auto pt = head;
    14. while(pt)
    15. {
    16. num++;
    17. pt = pt->next;
    18. }
    19. auto dummy = new ListNode(0);
    20. dummy->next = head;
    21. pt = dummy;
    22. int move = num - n;
    23. while(move--)
    24. {
    25. pt = pt->next;
    26. }
    27. pt->next = pt->next->next;
    28. return dummy->next;
    29. }
    30. };

    2 使用两个指针,遍历一次
    固定两个指针之间的距离,一旦前面一个指针到了尾部,那后面一个指针指向的就是要删除的

    1. /**
    2. * Definition for singly-linked list.
    3. * struct ListNode {
    4. * int val;
    5. * ListNode *next;
    6. * ListNode(int x) : val(x), next(NULL) {}
    7. * };
    8. */
    9. class Solution {
    10. public:
    11. ListNode* removeNthFromEnd(ListNode* head, int n) {
    12. auto dummy = new ListNode(0);
    13. dummy->next = head;
    14. auto left = dummy, right = dummy;
    15. int t = n + 1;
    16. while(t--)
    17. {
    18. right = right->next;
    19. }
    20. while(right)
    21. {
    22. left = left->next;
    23. right = right->next;
    24. }
    25. left->next = left->next->next;
    26. return dummy->next;
    27. }
    28. };

    第二次写题

    1. /**
    2. * Definition for singly-linked list.
    3. * struct ListNode {
    4. * int val;
    5. * ListNode *next;
    6. * ListNode(int x) : val(x), next(NULL) {}
    7. * };
    8. */
    9. class Solution {
    10. public:
    11. ListNode* removeNthFromEnd(ListNode* head, int n) {
    12. auto dummy = new ListNode(0);
    13. dummy->next = head;
    14. auto fast = dummy, slow = dummy;
    15. int move = n + 1;
    16. while(move--)
    17. {
    18. fast = fast->next;
    19. }
    20. while(fast)
    21. {
    22. fast = fast->next;
    23. slow = slow->next;
    24. }
    25. slow->next = slow->next->next;
    26. return dummy->next;;
    27. }
    28. };