概述
分析
-
这种题目,算是技巧题,见过一次就知道怎么做了,所以也不太好分析是怎么想到利用双指针来找倒数第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;
}
};
这篇博客探讨了一种常见的链表题目——删除链表的倒数第N个节点。作者指出,这类问题需要通过多刷题来培养直觉,并介绍了使用双指针技巧来解决。具体方法是创建一个虚拟头结点以方便处理头节点删除的情况,然后让两个指针以N的距离同步移动,当后指针到达链表末尾时,前指针所在位置即为要删除的节点。最后,通过修改前指针的next指针完成删除操作。

被折叠的 条评论
为什么被折叠?



