概述
分析
-
这种题目,算是技巧题,见过一次就知道怎么做了,所以也不太好分析是怎么想到利用双指针来找倒数第N个元素
这也是为什么我们需要多刷题的原因,有些题目真的没见过确实比较难想
-
而因为要删除元素,所有仍然需要虚拟头结点来统一可能对原链表头结点的删除操作
思路
双指针思路?
- 利用两个指针,保持固定的距离N同步移动,当后面的指针到达链表末尾时,前面指针的位置就是倒数第N个位置
代码
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode *virtual_head = new ListNode(); // 这里使用虚拟头结点是为了处理删除头结点的情况
virtual_head ->next = head;
ListNode *next_n_ptr = head;
while(n--) {
next_n_ptr = next_n_ptr -> next;
}
ListNode *work_ptr = head; // work_ptr 和 next_ptr距离为n
ListNode *pre_ptr = virtual_head;
while(next_n_ptr) {
pre_ptr = work_ptr; // 记录前一个结点
// 双指针,同步移动,包括固定距离n
work_ptr = work_ptr -> next;
next_n_ptr = next_n_ptr -> next;
}
// next_n_ptr指向的位置就是倒数n个元素,即我们要删除的元素
pre_ptr -> next = work_ptr -> next;
return virtual_head -> next;
}
};