LeetCode 19 Remove Nth Node From End of List
题目分析
https://leetcode.com/problems/remove-nth-node-from-end-of-list/
直接法
首先遍历一遍得到总长度,第二次遍历的时候就知道所在的节点的序号了。
快慢指针
虽说这道题挺简单的,但是不小心的话还是有可能没办法 one pass:
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode dummy(0, head);
        ListNode* l = &dummy;
        ListNode* r = &dummy;
        for (int i = 1; i <= n; i++) {
            r = r->next;
        }
        while (r && r->next) {
            r = r->next;
            l = l->next;
        }
        if (l->next) {
            l->next = l->next->next;
        } else {
            l->next = nullptr;
        }
        return dummy.next;
    }
};
之前做这道题时的实现,更加干净:
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode *fast = head, *slow = head;
        for (int i = 0; i < n; ++i) {
            fast = fast->next;
        }
        if (!fast) return head->next;
        while (fast->next) {
            fast = fast->next;
            slow = slow->next;
        }
        slow->next = slow->next->next;
        return head;
    }
};