Bootstrap

LeetCode 19. 删除链表的倒数第 N 个结点

删除链表倒数第N个节点

题目

双指针

首先让 flag 指向第 n 个结点;若以标号来标记指针,那么 while 开始时,pre = 0,flag = n;两者相差为 n;那么当 flag 在最终位置即长度 len,处时,此时两者相差仍然为 n;可以得出 len-pre=n;pre=len-n;此时在倒数第 (len - (len-n) + 1) = n + 1 处;即倒数第 n + 1 处,下一位为第 n 处,即为需要删除的位置

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* virhead = new ListNode();
        virhead->next = head;
        // 先指向第 n 个结点
        ListNode* flag = virhead;
        while(n--) {
            flag = flag->next;
        }
        // pre 为被删除结点的前一个结点
        ListNode* pre = virhead;
        while (flag->next) {
            pre = pre->next;
            flag = flag->next;
        }
        ListNode* d = pre->next;
        pre->next = d->next;
        delete d;
        head = virhead->next;
        delete virhead;
        return head;
    }
};
;