删除链表倒数第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;
}
};